LinkedHashMap通过哈希表加双向链表实现插入顺序有序;节点含before/after引用,put等操作将新节点追加至链表尾;默认accessOrder=false维持插入序,遍历天然有序。

LinkedHashMap 通过内部维护一个双向链表来保持插入顺序。它在继承 HashMap 的基础上,额外用链表把所有 Entry(或 Node)按插入顺序串起来,每次 put、putIfAbsent 等写入操作都会将新节点追加到链表尾部。
底层结构:哈希表 + 双向链表
LinkedHashMap 的每个节点(继承自 HashMap.Node)多了 before 和 after 两个引用,指向链表的前驱和后继节点。插入时,除了正常计算 hash、放入哈希桶,还会把该节点链接到链表末尾。
- 初始化时链表头(head)和尾(tail)都为 null
- 第一次插入:新节点同时是 head 和 tail
- 后续插入:新节点接在当前 tail 后面,并更新 tail 指针
构造方法决定顺序策略
LinkedHashMap 提供两个关键构造函数:
-
LinkedHashMap()或LinkedHashMap(int initialCapacity):默认按插入顺序排序(accessOrder = false) -
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder):若 accessOrder = true,则按访问顺序(最近访问在尾),用于实现 LRU 缓存
只要不显式传入 true 给 accessOrder,就始终维持插入顺序。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
注意:某些操作不会破坏顺序
以下行为不影响已存在元素的相对插入顺序:
- 重复 key 的
put(key, value):只更新值,不改变节点位置 -
get(key):在accessOrder=false时完全不调整链表 -
remove(key):仅从哈希表和链表中摘除该节点,其余节点顺序不变
遍历结果天然有序
调用 keySet()、values() 或 entrySet() 返回的集合,其迭代器均按链表顺序遍历,因此 for-each、stream 或 iterator 都能自然得到插入顺序:
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
// 输出:a=1, b=2, c=3
map.forEach((k, v) -> System.out.println(k + "=" + v));

















