LinkedHashMap实现LRU算法

什么是LRU

LRU 是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法。

在一般标准的操作系统教材里,会用下面的方式来演示 LRU 原理,假设内存只能容纳3个页大小,按照 7 0 1 2 0 3 0 4 的次序访问页。假设内存按照栈的方式来描述访问时间,在上面的,是最近访问的,在下面的是,最远时间访问的,LRU就是这样工作的。


LRU示意图

那么Java中如何实现一个LRU算法呢。

LinkedHashMap

LinkedHashMap是维护了双向链表的HashMap,保持了插入元素的顺序。

LinkedHashMap提供了一个钩子方法,在新插入元素后可以决定是否删除最老的元素。

/**
     * LRU中最大元素数量
     */
    private int maxSize;

    public LRUByLinkedHashMap(int maxSize) {
        // 容量为最大值/0.75,即最大负载容量为maxSize
        // accessOrder=true  根据查询排序,即最近被使用的放到后面
        super((int) Math.ceil(maxSize / 0.75) + 1, 0.75f, true);
        this.maxSize = maxSize;
    }

    /**
     * 此方法为钩子方法,map插入元素时会调用此方法
     * 此方法返回true则证明删除最老的因子
     *
     * @param eldest
     * @return
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > maxSize;
    }

推荐阅读更多精彩内容