LRU
实现LRU的原理
使用双链表 + HashMap 来实现 LRU
访问结点 get(key), 首先根据key 在map 中获取 结点的 引用, 然后把该结点由当前位置调整到链表尾部。
插入结点 put(key,val) 首先尝试获取 key结点,若存在则修改节点值,且类似于访问,把结点调整到链表尾部。
若不存在该key, 则若LRU还有容量,则将该结点直接插在尾部,且插入到map中。
若LRU已满,考虑替换,将头节点删除,把新结点接在尾部,且插入map中。
可以看出该过程,越久没使用的结点,越靠近链表头部。
HashMap
这些方法用于其子类LinkedHashMap 去维护 LRU的实现(默认情况LRU无限容量,不存在满的情况)
HashMap 本身的put 等方法维护map 本身, 但是map 的put方法也调用了以下三个空方法,这三个方法在子类LinkedHashMap中重写,所以 HashMap 的get 方法回调用重写的这三个方法,来维护双链表。