基于LinkedHashMap实现LRU缓存
原理
LinkedHashMap中的
removeEldestEntry
方法能够移除最近最少使用的key,所以只需要重写这个方法,判断map中的size大小和初始cahe的大小并返回true就行
实现
public class LinkedHashMapBasedLRUCache<K, V> {
private final int size;
private LinkedHashMap<K, V> cacheMap;
public LinkedHashMapBasedLRUCache(int size) {
this.size = size;
cacheMap = new LinkedHashMap<K, V>(size){
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
if (cacheMap.size() > size){
return true;
}
return false;
}
};
}
public void put(K k, V v){
this.cacheMap.put(k, v);
}
public V get(K k){
return this.cacheMap.get(k);
}
public int size(){
return this.cacheMap.size();
}
public Map<K, V> data(){
return this.cacheMap;
}
}
测试
@Test
public void lruCacheTest() {
LinkedHashMapBasedLRUCache<String, String> cache = new LinkedHashMapBasedLRUCache<>(2);
cache.put("a", "a");
cache.put("b", "b");
System.out.println("size: " + cache.size());
System.out.println("cache: " + cache.data());
System.out.println("after add third key");
cache.put("c", "b");
System.out.println("size: " + cache.size());
System.out.println("cache: " + cache.data());
}
结果:
size: 2
cache: {a=a, b=b}
after add third key
size: 2
cache: {b=b, c=b}
可以发现首次添加的key[a]已经被删除了,而且cache的大小也保持在初始大小2的容量