当前位置: 首页 > news >正文

认识LinkedHashMap

LinkedHashMap是HashMap的子类,上一节初步分析过HashMap,这一节分析LinkedHashMap。

LinkedHashMap的数据结构

Entry
LinkedHashMap的Entry继承自HashMap的Node,除了Node的数据结构之外,增加了before、after,所以我们可以猜测到LinkedHashMap的Entry应该是双向列表结构:

 static class Entry<K,V> extends HashMap.Node<K,V> {Entry<K,V> before, after;Entry(int hash, K key, V value, Node<K,V> next) {super(hash, key, value, next);}}

此外,LinkedHashMap定义了首节点和尾结点:

    transient LinkedHashMap.Entry<K,V> head;/*** The tail (youngest) of the doubly linked list.*/transient LinkedHashMap.Entry<K,V> tail;

table数组
继承自HashMap,没有变化!

数据依然保存在table数组中,不同的是table中的对象变成了Entry。

###LinkedHashMap的初始化
与HashMap的初始化方式、以及涉及到的容量、装载因子、扩容阈值等概念基本相同。

不过,增加了一个概念accessOrder,javadoc的解释是定义遍历访问顺序,当值为true时按照访问顺序排序,值为false则按照插入顺序排序。

    /*** The iteration ordering method for this linked hash map: <tt>true</tt>* for access-order, <tt>false</tt> for insertion-order.** @serial*/final boolean accessOrder;

LinkedHashMap赋值

LinkedHashMap的赋值逻辑如下(假设待存放的数据为e<key1,value1>):

  1. 检查table数组为空的话,初始化指定容量或者默认容量的table数组
  2. 根据key1的哈希值计算得出(算法为(容量 - 1) & hash(key1))对应的桶。这一步很重要,一般来讲优秀的hash算法能够尽可能确保不同的key值得到不同的hash值,也就可以确保放入不同的桶内。但是不可避免的,可能会存在不同key值得到相同hash值的情况(hash冲突:key1<>key2,hash(key1)=hash(key2)),这种情况下就会放置在相同的桶(比如table[5])内。
  3. 得到桶之后,判断桶内是否已经有数据。
  4. 没有数据则直接新建一个Node:newNode(hash, key1, value1, null),放在桶中,结束
  5. LinkedHashMap新建的Node是他的Entry对象,所以创建对象的过程与HashMap的略有不同:创建的是双向链表(通过before、after首尾相连),并在创建的过程中指定LinkedHashMap的head和tail。
  6. 否则,桶内有数据,有两种情况:一是为键值key1重复赋值、二是hash冲突。
  7. 如果是hash冲突,则new一个Node:newNode(hash, key1, value1, null)并将其设置为桶内的最后一个Node。
  8. 如果是重复赋值(桶内数据的key值=key1),则为key1重新赋值value1,并返回key1的旧值

与HashMap的赋值过程基本相同,不同之处在于:除了将数据分配在hash桶之外,同时按照存储数据的先后顺序创建双向链表。

从LinkedHashMap获取数据

LinkedHashMap通过key值获取数据的逻辑与HashMap的完全一致

通过get(key)方法获取数据的逻辑如下(假设要获取的数据key=key1):

  1. table数组不为空并且数组长度大于0,则采用与put数据相同的算法得到key1值对应的桶。
  2. 桶内不空则从第一个节点开始检查,如果节点key值等于key1,则返回该节点的value。如果第一个节点不满足条件,则依次检查桶内所有其他节点。
  3. 桶内空,或者桶内不空但是没有找到满足条件的对象(应该不可能)则返回null,表明当前HashMap中不存在key值为key1的对象

所以我们可以看到,正如名称给我们的启示一样,LinkedHashMap与HashMap的区别就是多了一个链表

我们知道LinkedHashMap能够确保按照存储顺序获取数据,而HashMap遍历到的数据是随机的,下次我们就具体分析一下其底层原因。

http://www.xdnf.cn/news/1029115.html

相关文章:

  • catelen数到二叉树节点的联想
  • C语言:字符函数
  • 高低温介电温谱测量系统在实际应用中有哪些具体的挑战?
  • 体系结构论文(八十六):The Dark Side ofComputing: SilentData Corruptions
  • 爱玛乐维CA510至臻版发布,品质跃迁塑造休三天花板
  • 【论文写作参考文献地址】
  • SSH远程连接到Windows服务器
  • 【树合集】
  • 纯免费的零基础建站教程
  • 从Seq2Seq到QKV:深度解析注意力机制的核心逻辑
  • Python|GIF 解析与构建(6):手搓 tk 录制工具
  • 【互联网基础】互联网公司机房怎么设计
  • Python训练营-Day30-模块和库的导入
  • EDW2025|从传统BI到AI Ready:企业数据与分析能力的实施策略演进
  • Java 锁升级机制详解
  • 芯片测试之VIL/VIH(输入电平)Test全解析:从原理到实战
  • 高通IPA硬件加速介绍
  • 03 | 大模型微调 | 从0学习到实战微调 | 玩转Hugging Face与Transformers框架
  • manpath: can‘t set the locale; make sure $LC_* and $LANG are correct
  • 设备管理-Udev(一)
  • E10集成登录三方系统
  • Python基础补漏
  • ESP32服务器端编码
  • SAM分割一切-使用SAM自动生成对象掩码示例
  • NB/T 32004-2018测试是什么,光伏并网逆变器NB/T 32004测试项目
  • ServiceNow培训第1期
  • MATLAB实现图像纹理特征提取
  • PMP证-介绍
  • 准确--使用 ThinBackup 插件执行备份和恢复
  • Python训练营打卡 Day53