LinkedHashMap 源码分析 - 访问最少删除策略
LinkedHashMap 源码分析-访问最少删除策略
访问最少删除策略也叫做 LRU(Least recently used,最近最少使用),意思就是经常访问的元素会移动到队尾,不经常访问的数据会在队头的位置,然后可以通过设置的删除策略,比如当元素大于多少个时,把最少使用的元素进行删除。
元素访问与转移
如何实现在访问时,元素被移动到队尾?源码:
复制代码
if ((e = getNode(hash(key), key)) == null) return null;
调用了 HashMap 的 get 方法
if (accessOrder) afterNodeAccess(e);
如果设置了 LRU 策略,则会把当前 key 移动到队列的尾部
主要是 通过 afterNodeAccess 方法把当前访问节点移动到了队尾
具备相同性质的方法还有:
复制代码
复制代码
复制代码
这些方法都是对于元素在访问时,不断的把访问的经常访问的节点移动到队尾,那么靠近队头的节点,自然就是很少被访问的元素了。
删除
复制代码
LinkedHashMap.Entry<K,V> first;
得到元素头节点
if (evict && (first = head) != null && removeEldestEntry(first))
removeEldestEntry()控制删除策略,如果队列不为空,并且删除策略允许删除的情况下,删除头节点
removeNode(hash(key), key, null, false, true);
删除头节点
评论