news 2026/6/10 13:58:45

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/6/10 13:43:33

Qwen3-1.7B temperature参数调优:生成质量提升实战指南

Qwen3-1.7B temperature参数调优&#xff1a;生成质量提升实战指南 你是不是也遇到过这样的情况&#xff1a;明明用的是最新开源的Qwen3-1.7B模型&#xff0c;输入同样的提示词&#xff0c;有时回答逻辑清晰、语言自然&#xff0c;有时却答非所问、啰嗦重复&#xff0c;甚至冒…

作者头像 李华
网站建设 2026/6/9 21:32:23

cv_unet_image-matting图像抠图实战教程:WebUI部署详细步骤

cv_unet_image-matting图像抠图实战教程&#xff1a;WebUI部署详细步骤 1. 为什么你需要这个抠图工具 你是不是经常遇到这些情况&#xff1a; 给客户做电商主图&#xff0c;要快速把人像从杂乱背景里抠出来&#xff0c;但PS太费时间&#xff1b;做社交媒体头像&#xff0c;想…

作者头像 李华
网站建设 2026/4/26 6:02:57

CAM++降本增效实战:中小企业声纹系统部署成本优化

CAM降本增效实战&#xff1a;中小企业声纹系统部署成本优化 1. 为什么中小企业需要“轻量级”声纹系统&#xff1f; 你有没有遇到过这些场景&#xff1a; 客服中心想做来电身份初筛&#xff0c;但商用声纹API按调用量收费&#xff0c;每月动辄上万元&#xff1b;员工考勤想加…

作者头像 李华
网站建设 2026/6/10 12:41:16

MinerU跨境电商应用:多语言说明书提取实战

MinerU跨境电商应用&#xff1a;多语言说明书提取实战 在跨境电商运营中&#xff0c;你是否经常遇到这样的问题&#xff1a;刚上架一批海外采购的电子设备&#xff0c;却只拿到一份全英文PDF说明书&#xff1b;平台要求补充德语、法语、日语版本&#xff0c;但人工翻译成本高、…

作者头像 李华
网站建设 2026/5/25 12:15:47

麦橘超然一键启动包:免配置快速部署完整指南

麦橘超然一键启动包&#xff1a;免配置快速部署完整指南 1. 这不是另一个“又要装环境”的AI工具 你是不是也经历过这样的时刻&#xff1a;看到一个惊艳的AI图像生成项目&#xff0c;兴致勃勃点开GitHub&#xff0c;结果第一行就写着“请先安装CUDA 12.1、PyTorch 2.3、DiffS…

作者头像 李华
网站建设 2026/5/30 17:10:36

ESP32实现离线语音识别大模型实战

以下是对您提供的博文内容进行 深度润色与工程化重构后的终稿 。整体风格更贴近一位资深嵌入式AI工程师在技术社区的真实分享&#xff1a;语言自然、逻辑严密、细节扎实&#xff0c;去除了所有AI生成痕迹和模板化表达&#xff1b;强化了“人话解释”、“踩坑经验”、“参数权…

作者头像 李华