一、概述

image.png
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 表 + 链表
  • 线程不安全的
  • 元素有序,

LinkedHashMap 底层存储图示:
image.png

二、代码分析

21.、继承体系

LinkedHashMap 它继承于 HashMap ,底层使用 哈希表 + 双向链表 保存数据。

LinkedHashMap 操作和 HashMap 基本一致,不同点在于重写了相关父类方法,维护了链表数据。

2.2、链表节点信息

image.png
如上述代码,LinkedHashMap 维护的链表节点继承自 HashMap.Node,HashMap.Node 代码如下
image.png
节点定义了头尾指针,所以是一个双向链表

2.3、LinkedHashMap 属性信息

image.png
如上述代码,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 中定义了三个回调方法,如下
image.png
在 HashMap 新增,删除操作时,进行方法的回调,从而操作 LinkedHashMap 中的链表数据,以此来维护顺序性。