美文网首页
自己实现LRU

自己实现LRU

作者: 废柴傻狗 | 来源:发表于2020-01-03 12:24 被阅读0次
    LRU特点

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

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

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

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

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

    public class Main {
        public static class LRUMap<K, V> extends LinkedHashMap<K, V> {
            private int cacheSize;
            @Override
            protected boolean removeEldestEntry(Map.Entry<K, V> 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<Integer, String> map = new LRUMap<Integer, String>(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

          本文链接:https://www.haomeiwen.com/subject/pdyboctx.html