LinkedHashMap 源码

LinkedHashMap

LinkedHashMap是一个有序的HashMap,它继承了HashMap, 其顺序有两种:按照访问的顺序和按照存储的顺序。顺序是由accessOrder字段控制,若accessOrder=true则说明是按照访问的顺序。若accessOrder=false则说明是按照存储的顺序。

其底层的数据结构是 HashMap+双向链表。如图所示:

LinkedHashMap 源码

LinkedHashMap的大部分方法都是采用HashMap的方法,比如put,remove等,我们接下来只说有关双向链表的部分

LinkedHashMap.Entry

LinkedHashMap的最底层Node是LinkedHashMap.Entry,他继承了HashMap.Node,同时具有两个新的指针before和after来构成双向链表

LinkedHashMap 源码

也就是说LinkedHashMap.Entry共有三个指针before,after和来自HashMap.Node的next

head和tail

LinkedHashMap存储了双向链表的head 和 tail

LinkedHashMap 源码

put方法

put方法调用的是hashmap的put方法

LinkedHashMap 源码

关键在于LinkedHashMap重写了newNode方法,在newNode中完成了put时的 在双向链表的结尾添加节点

LinkedHashMap 源码

LinkedHashMap 源码

在put完成后,又执行了afterNodeInsertion方法:

LinkedHashMap 源码

这个方法在HashMap中为空方法,在LinkedHashMap中重写了它

LinkedHashMap 源码

一般情况下,这个方法不会执行任何操作!因为removeEldestEntry的返回结果默认为false,他是让我们用来扩展的,我们可以重写它使得满足一定条件下移除队首节点(可以用它来实现LRU)

get

LinkedHashMap重写了get方法

LinkedHashMap 源码

如果顺序是访问顺序的话,get后会将get的节点放在链表的尾部

LinkedHashMap 源码

remove

remove同put一样调用的是HashMap的方法,只不过多一个afterNodeRemoval,调整双向链表中节点的顺序

LinkedHashMap 源码

上一篇:深度剖析Java集合之LinkedHashMap


下一篇:LinkedHashMap