linkedhashmap 默认保持插入顺序,无需额外配置;其通过双向链表支持插入顺序(默认)和访问顺序(需设置accessorder=true),正确创建方式为不启用accessorder,遍历时严格按插入顺序输出。

LinkedHashMap 默认就保持插入顺序,不需要额外配置,只要不启用访问顺序模式即可。
理解 LinkedHashMap 的两种顺序模式
LinkedHashMap 内部维护一个双向链表,用于记录元素的顺序。它支持两种顺序:
- 插入顺序(默认):元素按 put 或构造时传入的顺序排列,遍历结果与插入顺序一致
- 访问顺序:每次 get 或 put 已存在 key 时,对应节点会移到链表尾部,适合实现 LRU 缓存
是否启用访问顺序由构造函数的第三个参数 accessOrder 控制,默认为 false,即插入顺序。
正确创建保持插入顺序的 LinkedHashMap
直接使用无参或仅指定初始容量/负载因子的构造方法,就能确保插入顺序:
// ✅ 默认构造 —— 插入顺序 Map<string integer> map = new LinkedHashMap(); // ✅ 指定初始容量和负载因子 —— 仍保持插入顺序 Map<string integer> map = new LinkedHashMap(16, 0.75f); // ❌ 启用 accessOrder=true —— 变成访问顺序,不再保持插入顺序 Map<string integer> map = new LinkedHashMap(16, 0.75f, true); </string></string></string>
验证插入顺序是否生效
通过 for-each 遍历 entrySet、keySet 或 values,结果严格按插入顺序输出:
Map<string integer> map = new LinkedHashMap();
map.put("first", 1);
map.put("second", 2);
map.put("third", 3);
for (Map.Entry<string integer> e : map.entrySet()) {
System.out.println(e.getKey()); // 输出:first → second → third
}
</string></string>
注意:使用 keySet().iterator() 或 values().toArray() 同样遵循该顺序。
常见误区提醒
- 不要混淆 LinkedHashMap 和 TreeMap —— 后者按 key 排序,与插入无关
- 即使调用 put(key, value) 更新已有 key 的值,只要没开启 accessOrder,顺序不会变
- 如果需要线程安全且保持插入顺序,不能直接用 Collections.synchronizedMap 包装 LinkedHashMap(会丢失顺序保证),应考虑 ConcurrentLinkedQueue + 手动管理,或使用第三方并发 map 实现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











