欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实现LRU算法

程序员文章站 2024-03-18 12:30:28
...

本文参考Java 的 LinkedHashMap 集合源码
数据结构:LinkedHashMap
说明:LinkedHashMap中有个参数 accessOrder ,如果accessOrder为true,则 可以按访问元素的顺序 遍历元素;

实现:

class LRU<K, V> extends LinkedHashMap<K, V> {

    // 保存缓存的容量
    private int capacity;

    public LRU(int capacity, float loadFactor) {
        super(capacity, loadFactor, true);
        this.capacity = capacity;
    }

    /**
     * 重写removeEldestEntry()方法设置何时移除旧元素
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        // 当元素个数大于了缓存的容量, 就移除元素
        return size() > this.capacity;
    }
}

测试:

    public static void main(String[] args) {
        // 创建一个只有5个元素的缓存
        LRU<Integer, Integer> lru = new LRU<>(5, 0.75f);
        //初始化值
        lru.put(1, 1);
        lru.put(2, 2);
        lru.put(3, 3);
        lru.put(4, 4);
        lru.put(5, 5);
        lru.put(6, 6);
        lru.put(7, 7);
		lru.put(8, 8);
		//访问
        System.out.println(lru.get(4));
        lru.put(6, 666);

        // 输出: {5=5, 7=7, 8=8, 4=4, 6=666}
        // 可以看到最旧的元素被删除了
        // 且最近访问的4被移到了后面
        System.out.println(lru);
    }
相关标签: 算法 LRU