java LinkedHashMap实现LRUCache缓存

package java_map;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache<K,V> extends LinkedHashMap<K, V> {

    private static final long serialVersionUID = 1L;
    private static final int MAX_ENTRIES = 3;
    
    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        // TODO Auto-generated method stub
        return size()>MAX_ENTRIES;
    }
    
    public LRUCache() {
        super(16, 0.75f, true);
    }
    
    public static void main(String[] args) {
        Map<Integer,String> cache = Collections.synchronizedMap(new LRUCache<>());
        cache.put(1,"a");
        cache.put(2,"b");
        cache.put(3,"c");
        System.out.println(cache.keySet());
        cache.get(1);
        System.out.println(cache.keySet());
        cache.put(4, "d");
        System.out.println(cache.keySet());
    }
}
// linkedHashMap extends HashMap 具有和HashMap一样快的查找速度
// 内部维护一个双向链表,用来维护插入顺序或者LRU顺序
// 内部属性accessOrder决定了顺序,默认为false,此时维护的是插入顺序
// 构造函数 LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder)
// when accessOrder = true
// get操作会将该节点移到链表尾部,保证链表尾部是最近访问的节点,链表head节点就是最久未使用的节点
// put操作会将该节点移到链表尾部,保证链表尾部是最近访问的节点,链表head节点就是最久未使用的节点
// put操作后,when removeEldestEntry()方法返回为true会移除最晚的节点。就是head节点
// removeEldestEntry()默认为false,如果为true,必须继承LinkedHashMap重写这个方法。
// 实例:实现LRU缓存,通过移除最近最久未使用的节点。从而保证缓存空间足够。并且缓存的数据都是热点数据
原文地址:https://www.cnblogs.com/czsblog/p/11156102.html