java 利用Map做缓存一个简单实例

有时候需要将一批数据缓存,并且按照最近最少使用的规则淘汰。这时候就应该想到LRUMap。
LRUMap是一种尺寸固定的Map,当它的容量达到最大时采用最近最少使用的规则淘汰相应的元素。

 代码如下 复制代码
LRUMap cache = newLRUMap(5);
 
cache.put("01", "news 1");
cache.put("02", "news 2");
cache.put("03", "news 3");
cache.put("04", "news 4");
cache.put("05", "news 5");
 
String news1 = (String)cache.get("01");
String news2 = (String)cache.get("02");
String news3 = (String)cache.get("04");
String news4 = (String)cache.get("03");
String news5 = (String)cache.get("02");
String news6 = (String)cache.get("05");
 
cache.put("06", "news 6");
 
Iterator it = cache.entrySet().iterator();
while(it.hasNext()){
   Map.Entry entry = (Map.Entry)it.next();
   System.out.println(entry.getValue());
}

 

LazyMap:当你需要获取某个键值但发现该键值不存在时自动填充该键值,那就该考虑使用LazyMap,LazyMap采用了装饰模式装饰一个Map,并采用一个Transformer来决定当键值不存在时填充的规则(或者Factory)。
 

 代码如下 复制代码

Transformer reverseString = newTransformer(){
       publicObject transform(Object object){
           String name = (String)object;
           String reverse = StringUtils.reverse(name);
           returnreverse;
       }
    };
 
    Map names = newHashMap();
    Map lazynames = LazyMap.decorate(names, reverseString);
 
    System.out.println(lazynames.get("hello"));
    System.out.println(lazynames.get("thanks"));
    System.out.println(lazynames.get("not at all"));
 
    Factory factory = newFactory(){
       publicObject create(){
           return"NB";
       }
    };
 
    Map lazyname = LazyMap.decorate(names, factory);
 
    System.out.println(lazyname.get("woshishei"));
    System.out.println(lazyname.get("nishishei"));
    System.out.println(lazyname.get("not at all"));

 

综合使用LRUMap和LazyMap:

 代码如下 复制代码

Transformer reverseString = newTransformer(){
       publicObject transform(Object object){
           String name = (String)object;
           String reverse = StringUtils.reverse(name);
           returnreverse;
       }
    };
 
    LRUMap lruMap = newLRUMap(5);
    Map lazyMap = LazyMap.decorate(lruMap, reverseString);
 
    String name0 = (String)lazyMap.get("test0");
    String name1 = (String)lazyMap.get("test0");
    String name2 = (String)lazyMap.get("test0");
    String name3 = (String)lazyMap.get("test2");
    String name4 = (String)lazyMap.get("test4");
    String name5 = (String)lazyMap.get("test5");
    String name6 = (String)lazyMap.get("test0");
    String name7 = (String)lazyMap.get("test6");
    String name8 = (String)lazyMap.get("test8");
    String name9 = (String)lazyMap.get("test5");
 
    Iterator it = lazyMap.entrySet().iterator();
    while(it.hasNext()){
       Map.Entry entry = (Map.Entry)it.next();
       System.out.println(entry.getValue());
    }

 

当然可以在Transformer里可以做任何事,比如从网站爬取数据,并转换成相应的对象等。
如下代码从pchome的ip地址库中查询IP地址,首先定义一个ArticleTransformer对象,每次根据传入的参数从一个URL查询数据并返回。

 代码如下 复制代码
public class ArticleTransformer implements Transformer {
 
    protected final static int BUF_SIZE = 300;
 
    protected String queryURL;
    public String getQueryURL(){return queryURL;}
    public void setQueryURL(String queryURL){this.queryURL = queryURL;}
 
    protected long timeOut;
    public long getTimeOut(){return timeOut;}
    /**
     * @param timeOut 单位:ms
     */
    public void setTimeOut(long timeOut){this.timeOut = timeOut;}
 
    public Object transform(Object obj){
        ArticleRetriever retriever = new ArticleRetriever((String)obj);
        try{
            Thread thread = new Thread(retriever);
            thread.start();
            thread.join(timeOut);
            //Thread.sleep(3*1000);
        }catch(InterruptedException e){
            System.out.println("url request time out.");
        }
        return retriever.getResponse();
    }
 
    public class ArticleRetriever implements Runnable{
        private String name;
        private String response;
 
        public ArticleRetriever(String name){
            this.name = name;
        }
 
        public String getResponse(){
            return this.response;
        }
 
        public void run(){
 
            HttpURL url = null;
 
            try{
                HttpClient client = new HttpClient();
 
                url = new HttpURL(queryURL+name);
 
                GetMethod getMethod = new GetMethod(url.toString());
 
                getMethod.getParams().setContentCharset("UTF-8");
 
                client.executeMethod(getMethod);
 
                response = getMethod.getResponseBodyAsString();
            }catch(Exception e){
                System.out.println("Error get Article  " + url);
            }
 
        }
    }
 
}
<SPAN style="DISPLAY: none"> </SPAN>

 

然后如下代码调用

 代码如下 复制代码

String queryURL = "http://whois.pconline.com.cn/ip.jsp?ip=";
    ArticleTransformer transformer = new ArticleTransformer();
    transformer.setQueryURL(queryURL);
    transformer.setTimeOut(500);
 
    Map lruMap = new LRUMap(3);
    articleMap = LazyMap.decorate(lruMap, transformer);
 
    String ip1 = (String)articleMap.get("127.0.0.1");
    String ip2 = (String)articleMap.get("121.0.29.241");
    String ip3 = (String)articleMap.get("10.25.145.123");
    String ip4 = (String)articleMap.get("10.121.20.35");
    String ip5 = (String)articleMap.get("121.230.145.60");
    String ip6 = (String)articleMap.get("27.186.214.221");
    String ip7 = (String)articleMap.get("127.0.0.1");
 
    try {
        Writer writer = new FileWriter("D://hello.txt");
 
        Iterator it = articleMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            System.out.println(entry.getValue());
            if(entry.getValue() == null){
                writer.write("nulln");
            }else{
                writer.write((String)entry.getValue());
            }
        }
        if(writer!=null) writer.close();
    } catch (IOException e) {
        System.out.println("Error write file");
    }

 

最后输出如下的结果:

江苏省泰州市(泰兴)电信
河北省保定市电信
Internet保留地址

时间: 2024-11-09 09:26:52

java 利用Map做缓存一个简单实例的相关文章

java 使用线程做的一个简单的ATM存取款实例代码_java

实现Runnable接口.当一个线程已继承了另一个类时,就只能用实现Runnable接口的方法来创建线程,且便于保持程序风格的一致性. 我们知道,一个具有生命的线程,具有下面五种状态: 创建状态 使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread) 可运行状态 使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable) 运行中状态 Java运行系统通过调度选中一个Run

JAVA利用HttpClient进行POST请求(HTTPS)实例_java

最近,需要对客户的接口做一个包装,然后供自己公司别的系统调用,客户接口是用HTTP URL实现的,我想用HttpClient包进行请求,同时由于请求的URL是HTTPS的,为了避免需要证书,所以用一个类继承DefaultHttpClient类,忽略校验过程. 1.写一个SSLClient类,继承至HttpClient package com.pcmall.service.sale.miaomore.impl; import java.security.cert.CertificateExcept

java spring注入bean生成一个类实例,请问这个类实例是单体类吗?全局唯一吗。

问题描述 java spring注入bean生成一个类实例,请问这个类实例是单体类吗?全局唯一吗. 小弟刚从C++转JAVA不久,遇到这样一个问题,求高人帮忙解答. 我现在大体理解了注入的实现方式,例如在一个标注有@configuration 的类里面,如果一个方法 上面有@bean,那么这个方法的返回的类对象会被实例化. 我的疑问是这样的,这个实例化的对象是全局唯一的吗,或者说 是一个单体类吗? 因为我要在我的程序里不同地方使用调用这个bean的方法,我担心如果是单体类的话, 是否存在数据同步

JAVA按字节读取文件的简单实例_java

JAVA的IO流一直都是我比较头疼的部分(我没有系统学过JAVA,一般需要实现什么功能再去看文档). 最近遇到一个需求:一个字节一个字节地读取一个文件.网上很多方法,代码一大堆.我在这里和大家分享一个简单的办法(至少对我的需求是有效的). File file= new File(fileName); //filename为 文件目录,请自行设置 InputStream in= null; byte[] bytes= null; in = new FileInputStream(file); //

用Java实现小球碰壁反弹的简单实例(算法十分简单)_java

核心代码如下: if(addX){ x+=3; }else{ x-=3; } if(addY){ y+=6; }else{ y-=6; } if(x<=0||x>=(width-50)){ addX=!addX; } if(y<=0||y>=(height-50)){ addY=!addY; } 根据x和y递增的值,来决定角度. 以上这篇用Java实现小球碰壁反弹的简单实例(算法十分简单)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持. 以上是小编为您精心

jquery做的一个简单的屏幕锁定提示框

 这篇文章主要介绍了使用jquery做的一个简单的屏幕锁定提示框,需要的朋友可以参考下 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml"&

《ANSYS FLUENT 16.0超级学习手册》——2.6 FLUENT的一个简单实例

2.6 FLUENT的一个简单实例 1.网格导入与处理 (1)在"开始"程序菜单中运行FLUENT主程序,出现FLUENT Launcher对话框,选择3D,其他保持默认设置,单击OK按钮进入FLUENT界面,读入网格文件jointpipe.msh,如图2-33所示. (2)检查网格文件.单击General面板中的Check按钮,如图2-34所示,对网格进行检查.需保证网格最小单元体积minimum volume不小于0,即没有负体积网格. (3)设置网格区域尺寸.单击General面

JQuery做的一个简单的点灯游戏分享_jquery

最近屌丝被迫学习TypeScript(不学就会被开除,5555),所以得先学JavaScript,这下可好,所有网页相关的东西都得要有所了解,否则没法忽悠BOSS. 今天学了一小会JavaScript,这里先做了一个简单的点灯游戏,算是练手吧.其中用到了JQuery,否则事件绑定就会蛋疼了. 做为JavaScript的Hello World,这个玩意就是下面这个东东.这里简单说一下实现方法. 效果图: 首先定义一个样式表,别忘了自定义的元素前都要加圆点,否则无效(菜鸟被这个玩意害了好多次啊):a

java-关于Java变量的值以及一个简单的for循环语句

问题描述 关于Java变量的值以及一个简单的for循环语句 for(int i=2,j=1; j<10; i=(i==9)?(((++j)/j)+1):(i+1)){ System.out.printf("%d*%d=%2d%c",i,j,i*j, ((i==9)?'n':' ')); } 打印九九乘法表. (++j)/j+1中j和++j的值是怎么变化的?每一次循环j的值不是都应该加1吗? 谢谢各位 解决方案 自己动手编译调试一边,写程序重在实践 解决方案二: Java 运算符