LinkedHashMap简介
我们可以看到LinkedHashMap是继承于HashMap,实现了Map接口
- 概括的说,
LinkedHashMap
是一个于数组加双向链表,它是线程不安全的的,允许key和value都为null - 它继承自
HashMap
,实现了Map<K,V>
接口。其内部还维护了一个双向链表,在每次插入数据,或者访问、修改数据时,会增加节点、或调整链表的节点顺序。以决定迭代时输出的顺序。 - 默认情况,遍历时的顺序是按照插入节点的顺序。这也是其与
HashMap
最大的区别。 - 也可以在构造时传入
accessOrder
参数,使得其遍历顺序按照访问的顺序输出。
--------------------------------------------------------------------------------------------------------------------------------
- 构造方法
//accessOrder为true时表示该LinkedHashMap的key为访问顺序
//accessOrder为false表示该linkedHashMap的key为插入顺序
private final boolean accessOrder;
public LinkedHashMap(int initialCapacity, float loadFactor) {
//调用了父类HashMap的构造方法
super(initialCapacity, loadFactor);
//默认为false,也就是插入顺序
accessOrder = false;
}
public LinkedHashMap(int initialCapacity) {
super(initialCapacity);
accessOrder = false;
}
public LinkedHashMap() {
super();
accessOrder = false;
}
public LinkedHashMap(Map<? extends K, ? extends V> m) {
super(m);
accessOrder = false;
}
可以通过这个构造函数传参将accessOrder改为true,这时使得其遍历顺序按照访问的顺序输出。
可以 看出这个是按照访问顺序输出的。
LinkedHashMap调用了父类的构造方法
可以看出最后调用了一个init()方法,这个方法在HashMap中并没有被实现,它在LinkedHashMap中被实现。
对header进行了初始化
- LinkedHashMap 数据结构——基于数组加双向链表
LinkedHashMap是key键有序的HashMap的一种实现。它除了使用哈希表这个数据结构,使用双向链表来保证key的顺序
LinkedHashMap 在不对HashMap做任何改变的基础上,给HashMap的任意两个节点间加了两条连线(before指针和after指针),使这些节点形成一个双向链表。在LinkedHashMapMap中,所有put进来的Entry都保存在HashMap中,但由于它又额外定义了一个以head为头结点的空的双向链表,因此对于每次put进来Entry还会将其插入到双向链表的尾部。
- 一些常用方法
put(Key,Value)
对于put(Key,Value)方法而言,LinkedHashMap完全继承了HashMap的 put(Key,Value) 方法,只是对put(Key,Value)方法所调用的recordAccess方法和addEntry方法进行了重写;
此外,在LinkedHashMap的addEntry方法中,它重写了HashMap中的createEntry方法,我们接着看一下createEntry方法:
在LinkedHashMap中向哈希表中插入新Entry的同时,还会通过Entry的addBefore方法将其链入到双向链表中。其中,addBefore方法本质上是一个双向链表的插入操作,其源码如下:
get(Key)。
对于get(Key)方法而言,LinkedHashMap则直接对它进行了重写。