怎样让集合不能被修改?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
先区分不可修改视图、独立副本与元素本身不可变。Collections.unmodifiableList 只禁止经该视图修改,原列表变化仍可见;List.copyOf 创建结构不受原列表后续修改影响的不可修改列表。二者通常都不深拷贝元素。final 只禁止变量重新指向,不会冻结集合内容。
讲清原理
List.of、Set.of、Map.of 也可创建不可修改结果,但会拒绝 null,并且重复元素或键的处理有各自规则。List.copyOf 同样拒绝 null;若希望允许 null 的独立只读列表,可先复制到 ArrayList,再包装且不泄露副本。
对外承诺“不变”还要检查元素。如果列表里放着可变的地址对象,列表不支持 add,并不能阻止调用方修改地址中的街道字段。需要完整隔离时,必须同时设计元素的不可变性或复制策略。
例子与易错点
Java 21 的 main 片段:
var source = new java.util.ArrayList<>(java.util.List.of("A"));
var frozen = java.util.List.copyOf(source);
source.add("B");
System.out.println(frozen);
try { frozen.add("C"); }
catch (UnsupportedOperationException expected) {
System.out.println("禁止修改结构");
}
输出 [A]、“禁止修改结构”。复制隔离结构不等于深拷贝,也不等于解决了安全发布和元素并发访问问题。
相关题:第 16 题、第 18 题、第 37 题、第 39 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。