import java.util.LinkedHashMap;
import java.util.Map;
/**
* A cache implementing a least recently used policy.
*/
public class LRUCache<K, V> implements Cache<K, V> {
private final LinkedHashMap<K, V> cache;
public LRUCache(final int maxSize) {
cache = new LinkedHashMap<K, V>(16, .75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return this.size() > maxSize;
}
};
}
@Override
public V get(K key) {
return cache.get(key);
}
@Override
public void put(K key, V value) {
cache.put(key, value);
}
@Override
public boolean remove(K key) {
return cache.remove(key) != null;
}
@Override
public long size() {
return cache.size();
}
}
LinkedHashMap实现LRU(Least Recently Used)缓存,关键是重写LinkedHashMap接口中的removeEldestEntry()方法。
Java Doc中removeEldestEntry()方法的注释如下:
Returns true if this map should remove its eldest entry. This method is invoked by put and putAll after inserting a new entry into the map. It provides the implementor with the opportunity to remove the eldest entry each time a new one is added. This is useful if the map represents a cache: it allows the map to reduce memory consumption by deleting stale entries.