LinkedHashMap 底层使用HashMap实现,为了实现对key的顺序访问,底层同时也维护一个链表。在LinkedHashMap中有两种排序规则,一种是按插入顺序进行排序、一种是按最近获取顺序倒序(即最近访问的数据总会被替换到链表的尾部);利用LinkedHashMap,我们实现LRU,代码接口如下
/**
* @author sunyiwei
*/
public class LRULinkedHashMap<K, V> {
private LinkedHashMap<K, V> map;
private int cacheSize;
public LRULinkedHashMap(final int cacheSize) {
this.cacheSize = cacheSize;
final float loadFactor = 0.75f;
map = new LinkedHashMap<K, V>(16, loadFactor, true) {
//调用put方法后触发,默认是实现是false,不会移除头结点,如果返回true,则会移除头结点
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
if (cacheSize + 1 == map.size()) {
return true;
} else {
return false;
}
}
};
}
public synchronized V get(K key){
return map.get(key);
}
public synchronized void put(K key,V val){
map.put(key,val);
}
public synchronized void clear(){
map.clear();
}
public synchronized int size(){
return map.size();
}
}