https://www.imooc.com/article/22931
LinkedHashMap 在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。
image.png
image.png
LinkedHashMap 内部类 Entry 继承自 HashMap 内部类 Node,并新增了两个引用,分别是 before 和 after。这两个引用用于维护双向链表。

linkedHashMap的插入和删除方法都是直接食用的父类的实现,但是父类的方法不会把节点插入链表或从链表中删除,怎么办呢,hashMap有三个after开头的方法,在插入、删除节点之后会执行after开头的方法,linkedHashMap可以通过覆写after开头的方法,实现把节点插入链表或从链表中删除。

void afterNodeAccess(Node<K,V> p) { }
void afterNodeInsertion(boolean evict) { }
void afterNodeRemoval(Node<K,V> p) { }

默认情况下,linkedHashMap按插入顺序维护链表。在初始化linkedHashMap时可以设置按照访问顺序维护链表。当调用get/getOrDefault/replace等方法时,这些方法会调用afterNodeAccess将访问的节点移动到链表的尾部。

linkedHashMap实现缓存
在afterNodeInsertion方法里会通过afterNodeInsertion方法判定是否要移除最近使用最少的节点。通过覆写afterNodeInsertion可以制定不同的lru(Least Recently Used)缓存策略。


cathy_mu
15 声望1 粉丝

« 上一篇
9 hashMap
下一篇 »
红黑树