以下的讨论实现都是奔着O(1)时间复杂度
LRU
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
LRU 总体上是这样的,最近使用的放在前边(最左边),最近没用的放到后边(最右边),
来了一个新的数,如果内存满了,把旧的数淘汰掉(最右边),
那位了方便移动数据,我们肯定不能考虑用数组,
呼之欲出,就是使用链表了,
解决方案:链表(处理新老关系)+ 哈希(查询在不在),
LRU 缓存算法的核心数据结构就是哈希链表,双向链表和哈希表的结合体。这个数据结构长这样:
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()); } } }