【16】LRUChache

题目

LRU

思路

LRU 大家都不陌生,操作系统的作业做过,思路就是一旦添加或者访问某个元素,则将其的“访问属性”置零,而其他元素的访问属性统统减一,这样一来,访问属性最小的元素就是最久没访问过的。
但是,我看了下题解,似乎有个java类可以完美实现LRU 就是linkHashMap

收获

LinkedHashMap的构造函数:cache = new LinkedHashMap<>(capacity,0.75f,true);LinkedHashMap的三个构造函数分别是初始容量,扩容因子和是否移除旧的元素
若要实现移除旧元素则需要重写其函数:

protected boolean removeEldestEntry(Map.Entry eldest) {
                if(this.size() > capacity){
                    return true;
                }
                return false;
         }

代码

class LRUCache {

    Map<Integer,Integer> cache = null;

    // 这个是匿名内部类
    // LinkedHashMap的三个构造函数分别是初始容量,扩容因子和是否移除旧的元素
    public LRUCache(int capacity) {
        cache = new LinkedHashMap<>(capacity,0.75f,true){
            // 必须覆盖该方法来保证移除旧的元素
            // 返回false,不删除
            @Override
            protected boolean removeEldestEntry(Map.Entry eldest) {
                if(this.size() > capacity){
                    return true;
                }
                return false;
            }
        };
    }

    public int get(int key) {
        Integer v = this.cache.get(key);
        return v==null?-1:v.intValue();
    }

    public void put(int key, int value) {
        this.cache.put(key,value);
    }
}

个人小站:http://jun10ng.work/ 拥抱变化,时刻斗争,走出舒适圈。
原文地址:https://www.cnblogs.com/Jun10ng/p/12369110.html