基于LinkedHashMap手写LRU淘汰策略

上一篇 << 下一篇 >>>HashSet集合底层实现原理


LRU(最近最少使用)缓存淘汰算法一般用于缓存场景,当缓存满的时候,把最少使用的数据清掉。

方案1:当key使用的时候,count值+1,最后遍历key的count值,把最小的key清理出去。缺点是数据量大时遍历效率低
方案2:基于LinkedHashMap有序集合实现
原理:访问key的时候,就会将该key存放到链表最后的位置,链表最开头位置说明最近最少使用的

public class ManualLruAlgorithm extends LinkedHashMap {
    /**
     * 容量
     */
    private int capacity;

    public ManualLruAlgorithm(int capacity) {
        // 末尾accessOrder设置为true,表示访问顺序,当有访问时,key被挪到末尾,最前面是最少使用的数据
        super(capacity, 0.75f, true);
        this.capacity = capacity;
    }

    /**
     * 列表大小大于容量时,清理头结点
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > capacity;
    }

    public static void main(String[] args) {
        ManualLruAlgorithm lruCache = new ManualLruAlgorithm<>(3);
        lruCache.put("a","a");
        lruCache.put("b","b");
        lruCache.put("c","c");
        lruCache.put("d","d");
        // 打印结果:bcd,a已被淘汰
        lruCache.forEach((k, v) -> {
            System.out.print(k );
        });
        System.out.println();
        lruCache.put("c","e");
        // 打印结果:bdc,c已被挪到末尾
        lruCache.forEach((k, v) -> {
            System.out.print(k );
        });
    }
}

相关文章链接:
<< << << << <<<数组拷贝的几种方式及和链表结构的对比
<< << << << << << << <<

你可能感兴趣的:(基于LinkedHashMap手写LRU淘汰策略)