news 2026/4/23 12:51:30

LinkedHashMap 的实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LinkedHashMap 的实现

JavaLinkedHashMap:结合哈希表与链表的数据结构

LinkedHashMap是 Java 集合框架中的一种数据结构,结合了HashMap的高效查找特性和LinkedList的顺序维护特性。与普通的HashMap不同,LinkedHashMap保留了插入元素的顺序或访问顺序,使得它在许多场景下非常有用,尤其是需要保持元素顺序的场景。

1.LinkedHashMap类概述

LinkedHashMap继承自HashMap,因此它包含HashMap的所有特性,但额外实现了双向链表来维护元素的顺序。具体来说,LinkedHashMap中的每个元素都包含了前后指针,确保可以在插入时记录元素的顺序。

关键源码:LinkedHashMap类声明

java复制

public class LinkedHashMap<K,V> extends HashMap<K,V> { private transient LinkedHashMap.Entry<K,V> head; private transient LinkedHashMap.Entry<K,V> tail; public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; } }
  • headtail:表示链表的头节点和尾节点。
  • accessOrder:控制顺序是基于插入顺序(false)还是访问顺序(true)。

2. 双向链表的结构

LinkedHashMap内部使用了一个双向链表来维护元素的顺序。每个元素不仅存储了键值对,还包含了指向前后元素的指针,形成了一个链表。

关键源码:Entry

java复制

static class Entry<K,V> extends HashMap.Entry<K,V> { Entry<K,V> before, after; Entry(K key, V value, int hash, Entry<K,V> next) { super(key, value, hash, next); } }
  • before:指向前一个元素。
  • after:指向后一个元素。 通过这两个指针,LinkedHashMap可以快速地维护插入顺序或访问顺序。

3. 插入元素的流程

当我们向LinkedHashMap中插入元素时,除了会进行HashMap的常规插入操作外,还会在链表中插入元素,并更新headtail指针。

关键源码:put方法

  • putVal会在哈希表中查找元素,如果没有找到,就创建一个新的Entry并调用addEntry方法将其插入到哈希表中。
  • afterNodeAccess用于更新访问顺序,如果是访问顺序,它会将当前元素移到链表的末尾。

关键源码:addEntry方法

  • 插入操作addEntry将元素插入到哈希表的指定位置,并且在链表中将其添加到header(头部)后面。
  • 链表更新:通过e.aftere.before指针将新插入的元素与前后元素连接起来,确保顺序不变。

4. 查找元素的流程

LinkedHashMap中的查找过程与HashMap相似,都是通过哈希表来实现高效查找,但LinkedHashMap额外提供了一个功能:维护元素的顺序。

关键源码:get方法

  • get方法通过getEntry查找元素。如果找到元素并且accessOrdertrue,则调用afterNodeAccess更新元素在链表中的顺序。

关键源码:afterNodeAccess方法

  • moveToLast:将元素移到链表的末尾,确保元素访问顺序正确。

5. 删除元素的流程

删除元素时,LinkedHashMap会首先从哈希表中移除元素,然后在链表中删除该元素。这里需要注意的是,链表操作是双向的,删除时需要更新前后节点的指针。

关键源码:removeNode方法

  • 在删除元素时,除了在哈希表中移除元素外,还需要调整链表中的指针,确保删除操作后链表的完整性。

6.LinkedHashMap的迭代器

LinkedHashMap的迭代器LinkedHashIterator采用了双向链表的结构,能够按顺序返回元素。它通过维护headtail指针,在顺序遍历时非常高效。

关键源码:LinkedHashIterator

  • nextEntry:指向链表中的下一个元素,遍历时按顺序访问。
  • hasNext:判断是否有下一个元素,遍历结束时返回false

7. 访问顺序与插入顺序

LinkedHashMap提供了两种顺序:插入顺序和访问顺序。通过构造函数中的accessOrder参数,我们可以指定使用哪种顺序。

  • 插入顺序:元素按插入顺序排列。
  • 访问顺序:元素根据访问顺序排列,访问过的元素会被移动到链表的末尾。

8.LinkedHashMap的性能

LinkedHashMap的查找、插入和删除操作与HashMap相似,都是O(1)的时间复杂度。然而,由于其额外的链表维护操作,插入和删除操作的开销稍微大一些。对于需要维护顺序的场景,LinkedHashMap提供了非常高效且灵活的解决方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:19:14

企业客服场景实战:Live Avatar定制化数字人部署方案

企业客服场景实战&#xff1a;Live Avatar定制化数字人部署方案 1. 为什么企业客服需要定制化数字人 传统客服系统面临三大痛点&#xff1a;人力成本高、响应不及时、服务标准化难。当客户拨打热线或在网页发起咨询时&#xff0c;等待转接、重复描述问题、遇到情绪化客服等情…

作者头像 李华
网站建设 2026/4/23 12:11:57

ST7789V背光控制在STM32中的实践方法

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文严格遵循您的所有要求&#xff1a; ✅ 彻底去除AI痕迹 &#xff0c;语言自然、真实、有“人味”——像一位在嵌入式一线摸爬滚打多年的老工程师&#xff0c;在茶歇时跟你掏心窝子讲经验&#xf…

作者头像 李华
网站建设 2026/4/23 10:49:45

KeilC51和MDK共存时的编译器路径设置实战案例

以下是对您提供的博文内容进行深度润色与结构重构后的专业级技术文章。全文已彻底去除AI生成痕迹&#xff0c;语言更贴近一线嵌入式工程师的真实表达习惯&#xff1b;逻辑层层递进、由浅入深&#xff0c;兼具教学性与实战指导价值&#xff1b;所有技术细节均严格基于Keil官方文…

作者头像 李华
网站建设 2026/4/23 12:14:12

YOLOv9训练中断频发?环境依赖问题解决步骤详解

YOLOv9训练中断频发&#xff1f;环境依赖问题解决步骤详解 你是不是也遇到过这样的情况&#xff1a;刚跑起YOLOv9训练&#xff0c;不到十分钟就报错退出&#xff0c;终端里一串红色错误信息&#xff0c;最后卡在CUDA out of memory、ImportError: cannot import name xxx&…

作者头像 李华
网站建设 2026/4/23 12:16:19

Z-Image-Turbo_UI界面多平台兼容性测试结果分享

Z-Image-Turbo_UI界面多平台兼容性测试结果分享 1. 测试背景与目标 Z-Image-Turbo_UI 是一款基于 Gradio 框架构建的轻量级图像生成交互界面&#xff0c;用户只需在浏览器中访问 http://localhost:7860 即可快速启动图像生成流程。相比 ComfyUI 等复杂工作流平台&#xff0c;…

作者头像 李华
网站建设 2026/4/23 10:45:23

Llama3-8B显存爆了?22GB LoRA训练显存优化方案

Llama3-8B显存爆了&#xff1f;22GB LoRA训练显存优化方案 1. 为什么Llama3-8B训练会“爆显存” 你刚下载完 Meta-Llama-3-8B-Instruct&#xff0c;兴致勃勃打开 Llama-Factory&#xff0c;配置好数据集、LoRA 参数&#xff0c;点下 train.py —— 结果还没跑完第一个 batch&…

作者头像 李华