用Linkedhashmap实现LRU

参考链接:

https://msd.misuland.com/pd/2884250171976189898

https://www.xttblog.com/?p=4096

LRU 就是(Least Recently Used),最近最少使用,意思就是最近读取的数据放在最前面,最早读取的数据放在最后面,如果这个时候有新的数据进来,当缓存空间不够时,那么最后面存储的数据淘汰。

linkedhashmap 添加元素的过程中调用removeEldestEntry 判断是否要删除最老的元素,如果返回true,会删除双向链表中最老的元素,也就是头节点后面的元素。重写removeEldestEntry 即可实现LRU缓存。

public class LRUCache<K,V> extends LinkedHashMap<K, V> {
    private final int SIZE;
    public LRUCache(int size) {
        /** int initialCapacity, float loadFactor, boolean accessOrder
         * 这3个分别表示容量,加载因子和是否启用LRU规则
         */
        super(size, 0.75f, true);
        SIZE = size;
    }
    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        return size() > SIZE;
    }
    public static void main(String[] args) {
        LRUCache<Integer, Integer> map = new LRUCache<Integer, Integer>(5);
       //放入5个数据
        for (int i = 0; i++ < 5; ) {
            map.put(i, i);
        }
        //打印起始存储情况
        System.out.println("起始存储情况:"+map.toString());
        map.get(3);
        //打印命中之后的情况
        System.out.println("命中一个已存在的数据:"+map.toString());
        //存入一个已存在的数据,也就是命中一次缓存中的数据
        map.put(5, 6);
        //打印命中之后的情况
        System.out.println("覆盖一个已存在的数据:"+map.toString());
        //又存入缓存之外的数据
        map.put(6, 6);
        //打印又存储一个数据之后的情况
        System.out.println("新增一个数据后:"+map.toString());
    }
}

猜你喜欢

转载自blog.csdn.net/h2498864708/article/details/106979907
今日推荐