Java 集合之 LinkedHashMap

本贴最后更新于 1924 天前,其中的信息可能已经时异事殊

简介

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 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 288 关注
  • Java

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

    3167 引用 • 8207 回帖
  • 数据结构
    87 引用 • 115 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...