简介
LinkedHashMap 是继承自 HashMap 的有序实现,和 HashMap 同样都是非线程安全的,多线程环境中修改容易出现意想不到的问题。
LinkedHashMap 使用相关疑问
疑问 | 结论 |
---|---|
是否允许存 null | key 和 value 都可以为空 |
是否允许重复数据 | key 重复会覆盖,value 可以重复 |
存储是否有序 | 有序 |
是否线程安全 | 非线程安全 |
既然 LinkedHashMap 继承自 HashMap 那他们内部有哪些区别呢?
LinkedHashMap 中额外定义了三个属性
/**
* The head (eldest) of the doubly linked list.
* 双向链表的头部
*/
transient LinkedHashMap.Entry<K,V> head;
/**
* The tail (youngest) of the doubly linked list.
* 双向链表的尾部
*/
transient LinkedHashMap.Entry<K,V> tail;
/**
* The iteration ordering method for this linked hash map: true
* for access-order, false for insertion-order. * * @serial
* true 表示最近最少使用次序规则,false表示插入顺序规则,默认初始化为false;
*/
final boolean accessOrder;
LinkedHashMap.Entry 继承自 HashMap.Node 类并增加了两个属性
static class Entry<K,V> extends HashMap.Node<K,V> {
//增加了两个属性均是为了维护元素的顺序,每个元素中都存储了前后元素的位置,注意不要和 next 属性搞混了!!
//next是用于维护HashMap指定table位置上连接的Entry的顺序的
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
LinkedHashMap 的元素存储
翻阅 LinkedHashMap 源码并没有发现重写 HashMap 的 put 方法,而是重写了 put 方法里调用的几个子方法 如:‘newNode(...)’,‘replacementNode(...)’,‘newTreeNode(...)’等等,基于多态的调用,主要功能就是维护顺序,其它实现均和 HashMap 相同。
注:本篇文档是基于
JDK1.8
的源码所编写,原理和旧版 JDK 类似,只是实现稍有不同,主要区别还在于 JDK1.8 后的 HashMap 实现。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于