缓存---LRU算法实现

2.LRU

  以下是基于双向链表+HashMap的LRU算法实现,对算法的解释如下:

  设置一个map存放对应的键和值,同时设置一个双向链表,来保存最近最久未使用的关系,如果访问一个键,键存在于map中,访问完成后,我们在链表中将该键删除,然后将其添加到链表的首部,表示最近刚访问过这个键,当缓存满了后,如果要添加一个键值对,我们要删除的就是位于链表尾部的键和其对应的值,因为它是最久未访问的值。

class LRUCache {
    HashMap<Integer,Integer>cache=new HashMap<>();
    LinkedList<Integer>keys=new LinkedList<>();
    private static int sizeOfCache;
    public LRUCache(int capacity) {
        sizeOfCache=capacity;
    }
    
    public int get(int key) {
        if(cache.get(key)!=null){
            keys.remove(Integer.valueOf(key));//先在链表中删掉该键
            keys.addFirst(key); //然后将该键放到链表首部,表示刚被访问
            return cache.get(key);
        }
        return -1;
    }
    
    public void put(int key, int value) {
        if(cache.get(key)!=null)
            keys.remove(Integer.valueOf(key));
        else if(keys.size()==sizeOfCache){ //存储块已满
            int keyToRemove=keys.removeLast(); //链表最后一个键,代表最久未访问。
            cache.remove(keyToRemove);
        }
        keys.addFirst(key);
        cache.put(key,value);
    }
}

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */
posted @ 2019-07-04 22:11  yjxyy  阅读(520)  评论(0编辑  收藏  举报