LinkedHashMap通过双向链表保持插入顺序,遍历结果严格按put顺序输出;启用accessOrder=true可支持LRU访问顺序,适用于缓存淘汰等场景。

Java 中 HashMap 本身不保证任何顺序,它按哈希值存放元素,遍历时顺序是不可预测的。如果你需要“按键值对的插入顺序”来存储和遍历,正确做法是直接使用 LinkedHashMap ——它不是 HashMap 的配置选项,而是独立的、专为保持顺序设计的 Map 实现。
为什么不能用 HashMap 实现插入顺序?
HashMap 内部基于哈希表,元素位置由 key 的 hashCode() 和扩容策略决定,和你 put 的先后完全无关。即使你按 A→B→C 插入,遍历结果可能是 C→A→B。这是设计使然,不是 bug,也无法通过设置参数修正。
用 LinkedHashMap 替代 HashMap(最常用方式)
只需把声明和初始化从 HashMap 换成 LinkedHashMap,其余用法完全一致:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 声明:
Map<string integer> map = new LinkedHashMap();</string> - 插入:
map.put("first", 1); map.put("second", 2); map.put("third", 3); - 遍历:
for (Map.Entry<string integer> e : map.entrySet()) { ... }</string>—— 输出顺序永远是 first → second → third
额外能力:按访问顺序排列(LRU 缓存场景)
LinkedHashMap 还支持另一种顺序模式:把最近访问(get 或 put)的条目移到链表末尾,最久未访问的留在头部。适合实现缓存淘汰逻辑:
立即学习“Java免费学习笔记(深入)”;
- 启用访问顺序:
new LinkedHashMap(16, 0.75f, true) - 此时调用
map.get("key")会改变该 entry 在迭代中的位置 - 配合
removeEldestEntry()方法可轻松构建 LRU 缓存
注意点:LinkedHashMap 不是“排序”,只是“记序”
它不比较 key 或 value 的大小,也不重排已有数据。它只忠实地记录你 put 的时序,并在遍历时还原这个时序。如果需要按键自然顺序(如字母升序)或按值大小排序,应分别选择 TreeMap 或手动转为 List 后排序。

















