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

LinkedHashMap 默认按插入顺序维护键值对,但可以通过构造函数参数启用访问顺序模式,从而让最近访问(get 或 put)的元素排在链表尾部。
启用访问顺序模式
创建 LinkedHashMap 时传入 true 作为第三个参数(accessOrder),即可开启访问顺序:
new LinkedHashMap<K,V>(initialCapacity, loadFactor, true)- 不指定时默认为 false,即插入顺序
- 一旦启用,每次
get()或put()已存在的 key,该 entry 会被移到链表末尾
访问顺序的实际效果
启用 accessOrder 后,迭代顺序反映的是“最近最少使用”(LRU)行为:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 新插入的元素加在末尾
- 对已有 key 调用
get(key),对应 entry 移至末尾 - 调用
put(key, value)更新已有 key,该 entry 也移至末尾 - 遍历时,最先访问的是最久未使用的 entry(链表头),最后访问的是最新访问的(链表尾)
结合 removeEldestEntry 实现 LRU 缓存
重写 removeEldestEntry() 方法,可在 map 超过容量时自动淘汰最老的 entry(即链表头部):
立即学习“Java免费学习笔记(深入)”;
- 该方法在每次
put()后被调用 - 返回 true 表示删除链表头节点(最久未访问的)
- 典型写法:
return size() > MAX_CAPACITY;
注意点与常见误区
访问顺序只对已存在的 key 生效;新 key 的插入仍按常规追加到末尾:
-
get("missing")不会触发任何移动(也不会抛异常,只是返回 null) -
put("newKey", v)是插入操作,不是访问,所以新 entry 加在末尾 - 构造后无法动态切换 accessOrder,必须重建实例
- 线程不安全,多线程场景需外部同步或使用
Collections.synchronizedMap()

















