146. LRU 缓存

主要是利用LinkedHashMap的功能

LinkedHashMap继承了HashMap

学到了LinkedHashMap维护双向链表的方法

LinkedHashMap的Entry加入了一个before和after,用于维护Entry的加入顺序。

        next维护各个桶的顺序。

回忆LinkedHashMap源码记得看:

https://blog.csdn.net/weixin_45864705/article/details/127145695

 

class LRUCache {
    int cap;
    LinkedHashMap<Integer, Integer> cache = new LinkedHashMap<>();
    public LRUCache(int capacity) { 
        this.cap = capacity;
    }
    
    public int get(int key) {
        if (!cache.containsKey(key)) {
            return -1;
        }
        makeRecently(key);
        return cache.get(key);
    }
    
    public void put(int key, int val) {
        if (cache.containsKey(key)) {
            cache.put(key, val);
            makeRecently(key);
            return;
        }

//使用keySet方法获得所有key的集合,因为LinkedHashMap是一个有序的集合,所以会显示链表第一个key,然后使用iterator迭代器获取key集合,调用next方法获取第一个key对应的value。
if (cache.size() >= this.cap) { int oldestKey = cache.keySet().iterator().next(); cache.remove(oldestKey); } cache.put(key, val); } private void makeRecently(int key) { int val = cache.get(key); cache.remove(key); cache.put(key, val); } }

 

posted @ 2023-05-31 22:14  Lee最好好好吃饭  阅读(7)  评论(0)    收藏  举报