"简介 LinkedHashMap是继承自 HashMap 的有序实现,和 HashMap 同样都是非线程安全的,多线程环境中修改容易出现意想不到的问题。 LinkedHashMap使用相关疑问 疑问 结论 是否允许存 null key 和 value 都可以为空 是否允许重复数据 key 重复会覆盖,value 可以重 .."

Java 集合之 LinkedHashMap

简介

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 实现。

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:PipeSoloSymWide 等,欢迎大家加入,贡献开源。

    2094 引用 • 3641 回帖 • 619 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2198 引用 • 7508 回帖 • 985 关注
  • 数据结构
    50 引用 • 98 回帖 • 1 关注
回帖   
请输入回帖内容...