linkedhashmap 默认按插入顺序维护键值对,启用 accessorder=true 后按访问顺序排列,使最近访问(get/put)的元素移至链表尾,结合 removeeldestentry 可实现 lru 缓存。

LinkedHashMap 默认按插入顺序维护键值对,但可以通过构造函数参数启用访问顺序模式,从而让最近访问(get 或 put)的元素排在链表尾部。
启用访问顺序模式
创建 LinkedHashMap 时传入 true 作为第三个参数(accessOrder),即可开启访问顺序:
new LinkedHashMap<k>(initialCapacity, loadFactor, true)</k>- 不指定时默认为 false,即插入顺序
- 一旦启用,每次
get()或put()已存在的 key,该 entry 会被移到链表末尾
访问顺序的实际效果
启用 accessOrder 后,迭代顺序反映的是“最近最少使用”(LRU)行为:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 新插入的元素加在末尾
- 对已有 key 调用
get(key),对应 entry 移至末尾 - 调用
put(key, value)更新已有 key,该 entry 也移至末尾 - 遍历时,最先访问的是最久未使用的 entry(链表头),最后访问的是最新访问的(链表尾)
结合 removeEldestEntry 实现 LRU 缓存
重写 removeEldestEntry() 方法,可在 map 超过容量时自动淘汰最老的 entry(即链表头部):
- 该方法在每次
put()后被调用 - 返回 true 表示删除链表头节点(最久未访问的)
- 典型写法:
return size() > MAX_CAPACITY;
注意点与常见误区
访问顺序只对已存在的 key 生效;新 key 的插入仍按常规追加到末尾:
-
get("missing")不会触发任何移动(也不会抛异常,只是返回 null) -
put("newKey", v)是插入操作,不是访问,所以新 entry 加在末尾 - 构造后无法动态切换 accessOrder,必须重建实例
- 线程不安全,多线程场景需外部同步或使用
Collections.synchronizedMap()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










