Java中 Map 接口在 JDK 21 新增 SequencedMap 后的 putFirst/putLast/reversed 视图

作者:袖梨 2026-07-14
SequencedMap 是 JDK 21 新增的接口,定义插入顺序语义及首尾操作能力;提供 getFirstEntry、putFirst、putLast、reversed 等方法;LinkedHashMap 已实现该接口,HashMap 等不支持调用会抛异常。

Java 中的 Map 接口本身在 JDK 21 并未新增 putFirstputLastreversed 方法,这些能力来自新引入的 SequencedMap 接口 —— 它是 JDK 21 中对有序 Map 的标准化抽象,继承自 Map,并明确建模“可遍历顺序”和“可修改顺序”的语义。

SequencedMap 是什么?

它是一个新的接口(位于 java.util),定义了保持插入顺序(或用户定义顺序)且支持在序列首尾高效操作的 Map 行为。它不是替代 LinkedHashMap,而是为其(及类似实现如 TreeMap 在有序场景下)提供统一契约:

  • 所有方法都基于“序列位置”而非仅键值对逻辑;
  • 新增默认方法如 getFirstEntry()getLastEntry()putFirst(K,V)putLast(K,V)
  • 提供 reversed() 方法,返回一个实时、可变、反向视图(不是副本),修改视图会同步反映到原 Map;
  • LinkedHashMapConcurrentLinkedHashMap(第三方)等已实现该接口,JDK 自带的 LinkedHashMap 在 JDK 21+ 中直接实现了 SequencedMap

如何使用 putFirst / putLast

这两个方法只对支持“序列首尾插入”的实现有效(如 LinkedHashMap)。调用时:

  • map.putFirst("a", 1):将键 "a" 插入到序列最前面(若已存在,则移动至首,并更新值);
  • map.putLast("b", 2):将键 "b" 插入到序列最后(若已存在,则移动至尾,并更新值);
  • 如果 Map 不支持(例如 HashMap),调用会抛出 UnsupportedOperationException
  • 注意:这不同于 put() —— 后者仅按哈希/比较逻辑插入,不改变已有元素的相对顺序。

reversed() 视图的关键特性

SequencedMap.reversed() 返回的是一个反向、可变、延迟绑定的视图

立即学习“Java免费学习笔记(深入)”;

  • 不是拷贝,内存开销极小;
  • 对视图的 putremoveputFirst 等操作,会直接作用于原 Map(只是语义上“首尾互换”);
  • 例如:revMap = map.reversed(); revMap.putFirst("x", 99); 实际把 "x" 插入到原 map 的末尾;
  • 视图与原 Map 始终保持强一致性,包括迭代顺序、大小、空状态等。

实际编码建议

要安全使用这些新能力:

  • 声明类型优先用 SequencedMap<K,V> 而非 Map<K,V>,以获得编译期保障;
  • 创建实例仍用 new LinkedHashMap<>()(它已实现 SequencedMap);
  • 避免对非 SequencedMap 实现(如 HashMap)强制转型,运行时会失败;
  • 注意并发场景:标准 LinkedHashMap 仍不线程安全,多线程需额外同步或选用并发友好实现(如 ConcurrentLinkedHashMap)。

不复杂但容易忽略:这些方法的价值不在“新增功能”,而在于把长期被 LinkedHashMap 隐式支持却无统一 API 的行为,提升为标准契约 —— 让顺序敏感的 Map 操作更清晰、可组合、可推理。

相关文章

精彩推荐