自己实现LRU

LRU特点

规定:链表元素越靠前,表明越旧没有使用了。

  1. put的元素是全新的,则添加到链表最后。
  2. put的元素是已有的,将其更新到链表最后。
  3. 如果put时链表已达容量上限,则淘汰最近最久未使用的元素(头节点)。
LinkedHashMap可以轻松实现LRU

LinkedHashMap 底层由双向链表和哈希表组成,而且自带removeEldestEntry方法实现淘汰最近最久未使用元素的方法,但需要重写。

因此我们实现一个LRUMap类继承LinkedHashMap。

注意构造函数里的acessOrder要为true,实现顺序访问,这样最近最久未使用的元素会放在头节点上。

public class Main {
    public static class LRUMap extends LinkedHashMap {
        private int cacheSize;
        @Override
        protected boolean removeEldestEntry(Map.Entry eldest) {
            // 如果超过容量则丢弃最久未使用的元素
            if (cacheSize + 1 == this.size()) {
                return true;
            } else {
                return false;
            }
        }

        /**
         * 构造函数,调用父类构造方法
         * @param n LRU最大容量
         */
        public LRUMap(int n) {
            super(16,0.75f,true);
            this.cacheSize = n;
        }

        public String toString() {
            String s = "";
            for (Map.Entry e : this.entrySet()) {
                s += e.getValue() + " ";
            }
            return s;
        }
    }
    
    public static void main(String[] args) {
        LRUMap map = new LRUMap(3);
        // 淘汰2
        map.put(1, "1");
        map.put(2, "2");
        map.put(1, "1");
        map.put(3, "3");
        map.put(4, "4");
        System.out.println(map.toString());
    }
}

你可能感兴趣的:(自己实现LRU)