news 2026/5/4 1:31:27

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/21 12:16:56

思科修复已遭利用的 Unified CM RCE 0day漏洞

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;代码卫士 思科已修复位于 Unified Communications 和 Webex Calling中一个严重的RCE漏洞CVE-2026-20045。该漏洞已遭利用。 该漏洞影响思科 Unified CM、Unified CM SME、Unified CM IM & Prese…

作者头像 李华
网站建设 2026/4/17 16:05:58

通义千问3-14B部署教程:Ollama+WebUI双Buff环境搭建步骤详解

通义千问3-14B部署教程&#xff1a;OllamaWebUI双Buff环境搭建步骤详解 1. 为什么选Qwen3-14B&#xff1f;单卡跑出30B级效果的“守门员” 你是不是也遇到过这些情况&#xff1a;想用大模型做长文档分析&#xff0c;但Qwen2-72B显存爆了&#xff1b;想上手开源模型&#xff0…

作者头像 李华
网站建设 2026/5/2 18:00:03

Qwen3-Embedding-4B缓存机制:响应速度提升实战优化

Qwen3-Embedding-4B缓存机制&#xff1a;响应速度提升实战优化 你有没有遇到过这样的情况&#xff1a;向量服务明明部署好了&#xff0c;但每次调用 embedding 接口都要等 800ms 以上&#xff1f;用户批量请求一上来&#xff0c;延迟直接飙到 1.5 秒&#xff0c;下游检索系统卡…

作者头像 李华
网站建设 2026/5/4 1:08:28

2025年AI语音情感分析趋势一文详解:Emotion2Vec+ Large落地指南

2025年AI语音情感分析趋势一文详解&#xff1a;Emotion2Vec Large落地指南 1. 为什么现在必须关注语音情感分析&#xff1f; 你有没有遇到过这样的场景&#xff1a;客服系统听懂了用户说的每一句话&#xff0c;却完全没察觉对方已经气得拍桌子&#xff1f;智能音箱准确复述了…

作者头像 李华
网站建设 2026/5/4 1:09:51

电商安防实战:用YOLOv10镜像实现人流检测应用

电商安防实战&#xff1a;用YOLOv10镜像实现人流检测应用 1. 为什么电商场景需要实时人流检测 你有没有注意过&#xff0c;商场入口处的电子屏上跳动的数字&#xff1f;那不是装饰&#xff0c;而是实时人流统计——它决定着导购排班、促销节奏甚至消防预案。传统红外计数器在…

作者头像 李华
网站建设 2026/5/4 1:08:10

对比传统双门限法,FSMN深度学习模型更精准

对比传统双门限法&#xff0c;FSMN深度学习模型更精准 语音端点检测&#xff08;Voice Activity Detection, VAD&#xff09;是语音处理流水线中看似简单却极其关键的第一步。它决定了后续语音识别、声纹分析、语音合成等任务的输入质量。一个不准的端点检测&#xff0c;就像给…

作者头像 李华