Collections.unmodifiableList 返回的列表在遍历时是否安全
使用 iterator 遍历由 collections.unmodifiablelist 包装的列表是安全的,因为迭代器本身只支持读取操作,不会触发修改异常。只要底层原始列表在遍历过程中不被其他线程修改,或者你持有的是该不可变视图的快照式引用,遍历时就不会抛出 concurrentmodificationexception。需要注意的是,这种“不可修改”仅针对当前视图,若原始列表被外部修改,迭代器仍可能检测到结构变化并报错。

遍历时底层列表发生并发修改会怎样
如果在遍历过程中,底层原始列表的结构发生了改变(如添加、删除元素),迭代器会立即抛出 ConcurrentModificationException。这是因为 unmodifiableList 只是对原始列表的一个装饰器,其迭代器内部维护了一个期望的结构修改计数(modCount),一旦检测到实际计数与预期不符,就会中断遍历以保障数据一致性。

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
基于具体输入验证迭代器的行为差异
通过具体代码示例可以验证,当使用 unmodifiableList 时,尝试通过迭代器调用 remove() 方法会抛出 UnsupportedOperationException,而正常遍历则无异常。这进一步确认了该包装类在遍历时不仅防止了直接修改,也限制了迭代器的写操作能力。
立即学习“Java免费学习笔记(深入)”;
import java.util.*;
public class UnmodifiableListTest {
public static void main(String[] args) {
List<String> original = new ArrayList<>();
original.add("A");
original.add("B");
List<String> unmodifiable = Collections.unmodifiableList(original);
// 正常遍历
Iterator<String> it = unmodifiable.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 尝试通过迭代器移除元素
try {
it.remove();
} catch (UnsupportedOperationException e) {
System.out.println("UnsupportedOperationException: " + e.getMessage());
}
}
}

















