以下的讨论实现都是奔着O(1)时间复杂度

LRU

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

LRU 总体上是这样的,最近使用的放在前边(最左边),最近没用的放到后边(最右边),

来了一个新的数,如果内存满了,把旧的数淘汰掉(最右边),

那位了方便移动数据,我们肯定不能考虑用数组,

呼之欲出,就是使用链表了,

解决方案:链表(处理新老关系)+ 哈希(查询在不在),

LRU 缓存算法的核心数据结构就是哈希链表,双向链表和哈希表的结合体。这个数据结构长这样:

LRU和LFU的区别和使用场景

1、通常会用来做缓存的算法 当缓存被填满时,它应该删除最近最少使用的项目。

1.JDK自带的LinkHashMap实现

public class LRUCache{
    int capacity;
    Map<Integer, Integer> map;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        map = new LinkedHashMap<>();
    }

    public int get(int key) {
        if (!map.containsKey(key)) {
            return -1;
        }
        // 先删除旧的位置,再放入新位置
        Integer value = map.remove(key);
        map.put(key, value);
        return value;
    }

    public void put(int key, int value) {
        if (map.containsKey(key)) {
            map.remove(key);
            map.put(key, value);
            return;
        }
        map.put(key, value);
        // 超出capacity,删除最久没用的,利用迭代器删除第一个
        if (map.size() > capacity) {
            map.remove(map.entrySet().iterator().next().getKey());
        }
    }
}
View Code

相关文章: