Java 21 的 Collections.unmodifiableSequencedMap 创建顺序不可变、只读的 SequencedMap 包装视图,保留插入/访问顺序并支持 firstEntry() 等顺序操作,仅适用于 LinkedHashMap、TreeMap 等有序 Map,返回类型精确且静态类型安全。

Java 21 引入了 Collections.unmodifiableSequencedMap,它用于创建一个**顺序不可变的、只读的 SequencedMap 包装视图**。这个方法不是返回普通 Map,而是返回实现了 SequencedMap 接口的实例,因此既保留了插入顺序(或访问顺序),又禁止所有修改操作。
什么是 SequencedMap?
SequencedMap 是 Java 21 新增的接口,扩展自 Map,专门用于表达“有明确定义顺序”的映射结构(如 LinkedHashMap 或未来可能的有序实现)。它提供了 firstEntry()、lastEntry()、reverse() 等顺序感知方法。
只有原本就支持顺序语义的 Map(比如 LinkedHashMap、TreeMap)才能安全地被包装为 SequencedMap;若传入 HashMap(无定义顺序),虽然编译通过,但调用 firstEntry() 等方法的行为是未指定的(不推荐)。
如何使用 unmodifiableSequencedMap?
该方法接受一个非 null 的 SequencedMap 实例,返回其不可变视图。原始 map 仍可修改,但包装后的视图会立即反映变更(它是实时视图,不是快照)——不过所有修改方法(如 put、remove、clear)都会抛出 UnsupportedOperationException。
立即学习“Java免费学习笔记(深入)”;
- 确保传入的是真正有序的 map,例如:
new LinkedHashMap()或new TreeMap() - 不能传入
null,否则抛出NullPointerException - 返回的对象类型是
SequencedMap<k></k>,可直接调用firstEntry()、reversed()等方法
与 unmodifiableMap 的区别
Collections.unmodifiableMap 返回的是普通 Map,丢失了 SequencedMap 的能力;即使你传入的是 LinkedHashMap,也无法调用 firstEntry() —— 编译不通过。
而 unmodifiableSequencedMap 保持接口契约:返回类型精确,支持顺序操作,且静态类型安全。这是对只读有序映射场景的明确建模。
注意事项和常见陷阱
该包装器不深拷贝,也不冻结底层数据。如果原 map 被外部修改,不可变视图的内容也会变(只是你无法从视图侧改)。
- 若需真正隔离(防外部修改),应先复制再包装,例如:
Collections.unmodifiableSequencedMap(new LinkedHashMap(original)) - 不能通过反射或内部字段绕过限制——所有 public 修改方法都已重写并抛异常
- 注意泛型擦除影响:运行时无法校验 key/value 类型,类型安全依赖编译期
不复杂但容易忽略:它不是新集合,而是一个带增强契约的只读门面。用对了,能让 API 更清晰表达“我需要一个有序且不可变的映射”。


















