文章部分内容借鉴于此篇博文
https://blog.csdn.net/tangtong1/article/details/88934809
1. 简介
LinkedHashMap内部维护了一个双向链表,默认保证元素按照插入的顺序访问,也能以访问顺序访问。
插入顺序指的是put的顺序
访问顺序指的是只要访问该元素,在双向链表中就将此元素移除然后添加到链表末尾
2. 继承体系
LinkedHashMap继承自HashMap,拥有HashMap的所有特性,并且额外增加了一定的顺寻访问特性。
3. 源码解析
3.1. 属性
//双向链表的头节点
transient LinkedHashMap.Entry<K,V> head;
//双向链表的尾节点
transient LinkedHashMap.Entry<K,V> tail;
//是否按访问顺序排序
final boolean accessOrder;
accessOrder为true时按访问顺序存储元素,为false时按插入顺序存储元素
3.2. 构造方法
//指定初始容量和加载因子
public LinkedHashMap(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
accessOrder = false;
}
//指定初始容量
public LinkedHashMap(int initialCapacity) {
super(initialCapacity);
accessOrder = false;
}
//以默认的初始容量创建
public LinkedHashMap() {
super();
accessOrder = false;
}
//以Map集合创建
public LinkedHashMap(Map<? extends K, ? extends V> m) {
super();
accessOrder = false;
putMapEntries(m, false);
}
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
前四个构造方法accessOrder为false,说明双向链表是以插入顺序存储元素
最后一个构造方法accessOrder从构造方法参数传入,如果为true,则实现按访问顺序存储元素
3.3. 内部类
//位于linkedHashMap中
//此内部类用于维护双向链表
static class Entry<K,V> extends HashMap.Node<K,V