reversed()方法提供linkedhashmap的实时反向视图而不改变原始插入顺序,其底层共享同一双向链表,遍历方向相反但节点位置不变,且仅java 21+的sequencedmap实现(如linkedhashmap、treemap)支持该方法。

reversed() 方法不会改变 LinkedHashMap 的原始迭代顺序,它只是提供一个动态、只读的反向视图。
反转视图是实时且双向同步的
调用 map.reversed() 后,返回的 SequencedMap 视图与原 LinkedHashMap 共享同一份底层数据结构(双向链表)。这意味着:
- 在原 map 中新增或修改条目,反转视图中会立即体现对应位置的变化
- 在反转视图中调用
put()或remove()等写操作(如果实现类支持),也会同步反映到原 map 中 - 但注意:该视图默认为只读语义——多数 JDK 实现中,
reversed()返回的视图对结构性修改抛出UnsupportedOperationException,真正可变操作必须通过原 map 进行
原始插入顺序始终不变
LinkedHashMap 的核心行为由其内部双向链表维护。无论是否调用 reversed(),它的迭代顺序永远保持初始插入顺序(或访问顺序,取决于构造参数):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 第一次插入
"one"→ 它始终是第一个节点 - 最后一次插入
"three"→ 它始终是最后一个节点 -
reversed()只是让遍历时从链表尾部开始向前走,不移动、不复制、不重建任何节点
遍历行为对比清晰可见
假设创建如下 map:
SequencedMapmap.put("one", 1);
map.put("two", 2);
map.put("three", 3);
那么:
-
map.forEach(...)输出顺序是:one → two → three -
map.reversed().forEach(...)输出顺序是:three → two → one - 两者底层仍是同一个链表,只是迭代器方向相反
仅适用于支持 SequencedMap 的有序实现
该能力依赖 Java 21 引入的 SequencedMap 接口,因此:
-
LinkedHashMap和TreeMap支持reversed() -
HashMap不实现SequencedMap,无法调用此方法 - 必须使用 Java 21 或更高版本编译和运行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










