必须用LinkedHashMap,因其维护插入顺序;适用于LRU缓存、保持配置输入顺序、有序序列化输出及单元测试中按序执行等场景,注意accessOrder默认false,设true会变为访问顺序。

可以,但普通HashMap不行,得用LinkedHashMap。它内部维护了一个双向链表,把插入的键值对按顺序串起来,所以遍历的时候自然就按插入顺序返回。
哪些情况必须用LinkedHashMap
当业务逻辑依赖“谁先加、谁后加”这个时序时,就不能用HashMap了。比如:
- 实现LRU缓存——最近最少使用,需要快速淘汰最久没访问的项,靠链表头尾操作+访问重排序实现
- 解析配置或参数(如命令行选项、HTTP请求参数),要求保持用户输入顺序,方便后续校验或展示
- 构建有序的映射结构用于生成JSON/YAML等序列化输出,避免字段顺序随机影响可读性或兼容性
- 单元测试中模拟带顺序的上下文环境,比如按步骤注册处理器,执行时需严格按注册顺序调用
注意accessOrder参数的陷阱
LinkedHashMap构造方法有个boolean accessOrder参数,默认是false(插入顺序)。设为true就变成访问顺序:每次get或put已存在key,对应节点会被移到链表末尾。这适合LRU,但容易误用——如果你只想要插入顺序,千万别手抖传true。
常见错误写法:new LinkedHashMap(16, 0.75f, true) → 这样遍历时是按“最后访问时间”排序,不是插入顺序。
立即学习“Java免费学习笔记(深入)”;
替代方案对比:TreeMap和ArrayList+Map
TreeMap按key自然序或自定义比较器排序,和插入顺序无关;ArrayList配合普通Map虽能手动维护顺序,但增删查效率低、易出错。LinkedHashMap在保持顺序的同时,仍保有HashMap平均O(1)的查找性能,是更轻量、更安全的选择。
基本上就这些,不复杂但容易忽略accessOrder这个开关。










