linkedhashmap 默认按插入顺序维护元素,显式设置 accessorder=true 可启用 lru 顺序;每次 get 或 put 已存在 key 时节点移至尾部,头部为最久未使用项,配合重写 removeeldestentry 可实现自动缓存淘汰。

LinkedHashMap 是 Java 中一个非常实用的 Map 实现,它既能保持插入顺序,也能按访问顺序(即最近最少使用 LRU)排列元素,关键在于构造时传入的 accessOrder 参数。
插入顺序:默认行为,无需额外配置
如果不指定参数,或只传初始容量和加载因子,LinkedHashMap 默认按插入顺序维护元素。新加入的键值对会追加到链表尾部,遍历时顺序与 put 的顺序完全一致。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适用于需要“记住添加先后”的场景,比如日志记录、操作历史、配置项解析等
- 遍历结果稳定可预测,比 HashMap 更适合调试和序列化输出
- 示例:
Map<string integer> map = new LinkedHashMap(); map.put("a", 1); map.put("b", 2); map.put("c", 3);</string>→ 遍历顺序一定是 a→b→c
LRU 顺序:启用 accessOrder = true
要实现最近最少使用排序,必须在构造时显式设置 accessOrder = true:
- 每次
get()或put()已存在 key 时,对应节点会被移到链表尾部(表示“刚刚被访问”) - 链表头部始终是“最久未使用”的条目,便于手动淘汰(如实现缓存淘汰策略)
- 正确写法:
new LinkedHashMap(16, 0.75f, true)—— 第三个参数为true
结合 removeEldestEntry 实现自动 LRU 缓存
仅靠 accessOrder 只能排序,不能自动删除旧条目。需重写 removeEldestEntry() 方法:
- 该方法在每次 put 后被调用,返回
true则移除链表头节点(即最老的) - 常用于限制最大容量:
protected boolean removeEldestEntry(Map.Entry<k> eldest) { return size() > MAX_SIZE; }</k> - 注意:必须确保是
accessOrder = true,否则访问不会改变顺序,LRU 失效
注意事项和常见误区
-
put()同一个 key 多次,会更新 value 并将该节点移到尾部(在 accessOrder=true 时) -
containsKey()和get()都算“访问”,都会触发顺序调整(accessOrder=true 时) - 迭代器、keySet()、entrySet()、values() 都遵循链表顺序,不是哈希桶顺序
- 性能略低于 HashMap(多维护双向链表),但仍是 O(1) 平均时间复杂度
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










