目录
LinkedHashmap
概述
LinkedHashMap
来自于 JDK1.4
,直接继承自 HashMap
。在 HashMap
基础上,通过维护一张基于整个哈希表的大双链表,解决了 HashMap
遍历元素时无序的问题
LinkedHashMap
是HashMap
的子类,与HashMap
有着同样的数据存储结构。它保留了元素插入的顺序,可以使元素的输出顺序与输入顺序相同LinkedHashMap
可以用来实现LRU
算法LinkedHashMap
同样是非线程安全的,只在单线程环境下使用
LinkedHashmap
源码剖析
LinkedHashMap
基本属性
除了继承 HashMap
的属性,LinkedHashMap
类中还增加了 3
个属性用于实现保证元素顺序
// 用来指向双向链表的头节点,整个 LinkedHashMap 中只有一个 header,
// 它将哈希表中所有的 Entry 贯穿起来,header 中不保存 key-value 对,只保存前后节点的引用
transient LinkedHashMap.Entry<K,V> head;
// 用来指向双向链表的尾节点
transient LinkedHashMap.Entry<K,V> tail;
// 排序方式:true:访问顺序迭代,false:插入顺序迭代
final boolean accessOrder;
LinkedHashMap
构造器
LinkedHashMap()
默认无参构造器,构造一个带默认初始容量为 16
和加载因子为 0.75
的空LinkedHashMap
实例。除了调用父类无参构造器之外,还设置 accessOrder=false
,这表明使用插入顺序遍历元素
public LinkedHashMap() {
// 调用父类 HashMap 的无参构造器
super();
accessOrder = false;
}
LinkedHashMap
常见的 API
方法
LinkedHashMap
的大部分方法的主体结构完全是使用的父类 HashMap
的方法。比如 put、remove
// 父类 HashMap 实现的方法
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
// 父类 HashMap 实现的方法
public V remove(Object key) {
HashMap.Node<K,V> e;
return (e = removeNode(hash(key), key, null, false, true)) == null ?
null : e.value;
}
那么 LinkedHashMap
有没有自己的方法呢?当然有,并且还有一个特点,那就是这些方法和自己的三个属性有关,比如 get、containsValue、clear
方法等
// LinkedHashMap重写的 get方法,增加了 accessOrder的判断
public V get(Object key) {
Node<K, V