LinkedHashMap是一个有序的HashMap,它继承了HashMap, 其顺序有两种:按照访问的顺序和按照存储的顺序。顺序是由accessOrder字段控制,若accessOrder=true则说明是按照访问的顺序。若accessOrder=false则说明是按照存储的顺序。
其底层的数据结构是 HashMap+双向链表。如图所示:
LinkedHashMap的大部分方法都是采用HashMap的方法,比如put,remove等,我们接下来只说有关双向链表的部分
LinkedHashMap的最底层Node是LinkedHashMap.Entry,他继承了HashMap.Node,同时具有两个新的指针before和after来构成双向链表
也就是说LinkedHashMap.Entry共有三个指针before,after和来自HashMap.Node的next
LinkedHashMap存储了双向链表的head 和 tail
put方法调用的是hashmap的put方法
关键在于LinkedHashMap重写了newNode方法,在newNode中完成了put时的 在双向链表的结尾添加节点
在put完成后,又执行了afterNodeInsertion方法:
这个方法在HashMap中为空方法,在LinkedHashMap中重写了它
一般情况下,这个方法不会执行任何操作!因为removeEldestEntry的返回结果默认为false,他是让我们用来扩展的,我们可以重写它使得满足一定条件下移除队首节点(可以用它来实现LRU)
LinkedHashMap重写了get方法
如果顺序是访问顺序的话,get后会将get的节点放在链表的尾部
remove同put一样调用的是HashMap的方法,只不过多一个afterNodeRemoval,调整双向链表中节点的顺序