首页 > 其他 > 详细

LRU原理与实现

时间:2015-09-24 23:56:32      阅读:434      评论:0      收藏:0      [点我收藏+]

一、LRU是什么

Least Recently Used,也就是最近最少使用,LRU缓存将最近最少使用的数据移除,让给最新读取的数据。而往往是最常读取的,也就是读取次数最多的。所以利用LRU缓存,我们可能提高系统的performance.

二、LRU的实现

  • 实现方法一:使用 LinkedHashMap 

使用LinkedHashMap的好处:

技术分享

代码如下

public class MyLRUCache1<K,V>{

    private static final float hashTableLoadFactor = 0.75f;

    private LinkedHashMap<K,V > map ;
    private int cacheSize ;

    public MyLRUCache1( int cacheSize){
        this.cacheSize = cacheSize ;
        int hashTableCapacity = (int)Math.ceil(cacheSize/hashTableLoadFactor)+1;
        //an anonymous inner class,true means accessOrder
        map = new LinkedHashMap<K,V>(hashTableCapacity, hashTableLoadFactor, true) {
            private static final long serialVersionID=1;
            @Override
            protected boolean removeEldestEntry(Entry<K, V> eldest) {
                //在什么情况下进行回收
                return size()> MyLRUCache1.this.cacheSize ;
            }
        };

    }

    public synchronized V get(K key){
        return map.get(key) ;
    }

    public synchronized void put(K key,V value){
        map.put(key, value) ;
    }

    public synchronized void clear (){
        map.clear();
    }

    public synchronized int usedEntries(){
        return map.size() ;
    }

    public synchronized Collection<Map.Entry<K,V>> getAll(){
        return new ArrayList<Map.Entry<K,V>>(map.entrySet()) ;
    }
}

测试方法

StringBuilder sb = new StringBuilder() ;
        cache.put("1", "one");  //1
        cache.put("2", "two");   //2 1
        cache.put("3", "three"); //3 2 1
        cache.put("4", "four");  //4 3 2
        if (cache.get("2")== null)
            throw new Error() ; //2 4 3
        for (Map.Entry<String,String > e : cache.getAll()){
            sb.append(e.getKey()+":"+e.getValue()+"\n");
        }
        cache.put("5", "five"); //5 2 4
        cache.put("4", "second four");//4 5 2
        //verify cache content
        sb.append("cache used:"+cache.usedEntries()+"\n") ;
        sb.append(cache.get("4")+"\n");
        sb.append(cache.get("5")+"\n");
        sb.append(cache.get("2")+"\n");
        for (Map.Entry<String,String > e : cache.getAll()){
            sb.append(e.getKey()+":"+e.getValue()+"\n");
        }
        tv.setText(sb.toString());
        Log.d(TAG,sb.toString()) ;

结果如下

3:three
4:four
2:two
cache used:3
second four
five
two
4:second four
5:five
2:two

 

  

 

LRU原理与实现

原文:http://www.cnblogs.com/chuiyuan/p/4836877.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!