LinkedHashMap实现LRU

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();
    }
    
    
}
posted @ 2021-07-09 12:33  奕为  阅读(109)  评论(0编辑  收藏  举报