LinkedHashMap及其源码分析(基于JDK1.7)

LinkedHashMap及其源码分析

阅读目录

以下内容基于jdk1.7.0_79源码;

什么是LinkedHashMap

继承自HashMap,一个有序的Map接口实现,这里的有序指的是元素可以按插入顺序或访问顺序排列;

LinkedHashMap补充说明

与HashMap的异同:同样是基于散列表实现,区别是,LinkedHashMap内部多了一个双向循环链表的维护,该链表是有序的,可以按元素插入顺序或元素最近访问顺序(LRU)排列,

简单地说:LinkedHashMap=散列表+循环双向链表

LinkedHashMap的数组结构

用画图工具简单画了下散列表和循环双向链表,如下图,简单说明下:

第一张图是LinkedHashMap的全部数据结构,包含散列表和循环双向链表,由于循环双向链表线条太多了,不好画,简单的画了一个节点(黄色圈出来的)示意一下,注意左边的红色箭头引用为Entry节点对象的next引用(散列表中的单链表),绿色线条为Entry节点对象的before, after引用(循环双向链表的前后引用);

第二张图专门把循环双向链表抽取出来,直观一点,注意该循环双向链表的头部存放的是最久访问的节点或最先插入的节点,尾部为最近访问的或最近插入的节点,迭代器遍历方向是从链表的头部开始到链表尾部结束,在链表尾部有一个空的header节点,该节点不存放key-value内容,为LinkedHashMap类的成员属性,循环双向链表的入口;

LinkedHashMap继承的类与实现的接口

LinkedHashMap源码中双向链表的操作

同样画了一张图,主要是插入删除、操作,如下图,应该挺好理解的,链表的操作

猜你喜欢

转载自blog.csdn.net/lusa1314/article/details/84314849