Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

怎样让集合不能被修改?

查看完整题解

参考回答

直接回答

先区分不可修改视图、独立副本与元素本身不可变。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 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。