您的位置:首页 > 编程语言 > Java开发

java 基于linkedhashmap实现LRUCache

2014-10-29 14:40 453 查看
所谓LRU就是最近最少被使用的意思,LRUCache的目的就是当缓存中的数据量达到一定的程度时,添加新的数据会将最近最少被使用的旧数据删除,以保障Cache中的数据都是经常需要的数据,提高命中率。下面是一个基于linkedhashmap的LRUCache的简单实现,关键是重写LinkedHashMap的removeEldestEntry方法,在LinkedHashMap中该方法默认返回false(LRUCache本身未考虑线程安全的问题)

public class BasicLRUCache<K, V> {
private LinkedHashMap<K, V> map;
private int cacheSize;

static final int DEFAULT_CACHE_SIZE = 2;

public BasicLRUCache() {
this(DEFAULT_CACHE_SIZE);
}

public BasicLRUCache(int cacheSize) {
this.cacheSize = cacheSize;
int hashTableSize = (int) Math.ceil(cacheSize/0.75f) + 1;
map = new LinkedHashMap<K,V>(hashTableSize, 0.75f, true) {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K,V> eldest) {
System.out.println("size=" + size() + " cacheSize=" + BasicLRUCache.this.cacheSize);
return size() > BasicLRUCache.this.cacheSize;
};
};
}

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

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

public static void main(String[] args) {
BasicLRUCache<String, String> lruCache = new BasicLRUCache<String, String>(3);
lruCache.put("1", "1");
lruCache.put("2", "2");
lruCache.put("3", "3");
lruCache.put("4", "4");
System.out.println(lruCache.get("1"));
System.out.println(lruCache.get("2"));
System.out.println(lruCache.get("3"));
System.out.println(lruCache.get("4"));
}
}
上面的程序运行的结果将是如下,从下面的结果中可以看出缓存大小为3时,当添加第4个元素时,最新插入的元素会被删除掉。

size=1 cacheSize=3
size=2 cacheSize=3
size=3 cacheSize=3
size=4 cacheSize=3
null
2
3
4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: