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