一、概述
doc 描述:LinkedHashMap 通过 哈希表和链表实现的,LinkedHashMap 通过链表来保证对哈希表迭代时的有序性。
有两种有序性:
1、重复插入相同键。如:1,2,3,4,再次插入2,顺序仍未 1,2,3,4
1、重复插入相同键。如:1,2,3,4,再次插入2,顺序为 1,3,4,2
LinkedHashMap 特点如下:
- key,value 都能为 null
- 底层:Hash 表 + 链表
- 线程不安全的
- 元素有序,
二、代码分析
21.、继承体系
LinkedHashMap 它继承于 HashMap ,底层使用 哈希表 + 双向链表 保存数据。
LinkedHashMap 操作和 HashMap 基本一致,不同点在于重写了相关父类方法,维护了链表数据。
2.2、链表节点信息
如上述代码,LinkedHashMap 维护的链表节点继承自 HashMap.Node,HashMap.Node 代码如下
节点定义了头尾指针,所以是一个双向链表
2.3、LinkedHashMap 属性信息
如上述代码,LinkedHashMap 属性有三个:
- LinkedHashMap.Entry head;
链表头指针 - LinkedHashMap.Entry tail;
链表尾指针 - boolean accessOrder;
默认:false;
accessOrder = true,重复键插入会改变顺序,如:1,2,3,4,再插入2,会变成 1,3,4,2
accessOrder = false,重复键插入不会改变顺序,如:1,2,3,4,再插入2,还是1,2,3,4
2.4、LinkedHashMap 如何做到双向链表的维护
在 HashMap 中定义了三个回调方法,如下
在 HashMap 新增,删除操作时,进行方法的回调,从而操作 LinkedHashMap 中的链表数据,以此来维护顺序性。