![fa72f89ca37df958b27d1057e816f234.png](https://i-blog.csdnimg.cn/blog_migrate/5cbbf9348f6abe44bd4dc09d8ea398c1.jpeg)
1概述
LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。除此之外,LinkedHashMap 对访问顺序也提供了相关支持。在一些场景下,该特性很有用,比如缓存。在实现上,LinkedHashMap 很多方法直接继承自 HashMap,仅为维护双向链表覆写了部分方法。所以,要看懂 LinkedHashMap 的源码,需要先看懂 HashMap 的源码。
2.1 LinkedHashMap的数据结构
![781e2af54d152049a11ab2bf98aafb0d.png](https://i-blog.csdnimg.cn/blog_migrate/9dfc08a6c2a1377144eb717427ed2056.jpeg)
可以从上图中看到,LinkedHashMap数据结构相比较于HashMap来说,添加了双向指针,分别指向前一个节点——before和后一个节点——after,从而将所有的节点已链表的形式串联一起来,从名字上来看LinkedHashMap与HashMap有一定的联系,实际上也确实是这样,LinkedHashMap继承了HashMap,重写了HashMap的一部分方法,从而加入了链表的实现。让我们来看一下它们的继承关系。
2.2 LinkedHashMap的继承关系
2.2.1 Entry的继承关系
![616024bd470ac364b31b06dd0c03b86e.png](https://i-blog.csdnimg.cn/blog_migrate/f92cdfb4e7e9360884f5c55c397ba465.jpeg)
核心数据结构中,lhm在自己的Node结构中,加入了before与after节点,表明 这是一个双向链表,那么如果尾结点的after指向了head,head的before指向了tail节点,那么这就是一个循环链表,通过代码发现并没有这么说,表明这仅仅是一个双向链表;与Node中的next不同,nex