Java中ArrayList本身可修改,但可通过Collections.unmodifiableList()创建只读视图,该视图调用add、remove等方法会抛出UnsupportedOperationException;注意底层ArrayList仍可被修改,若需真正不可变,应使用Java 10+的List.copyOf()或Java 9+的List.of()。

Java 中 ArrayList 本身不是只读的,但可以通过包装方式创建一个不可修改的视图。最常用、最安全的方式是使用 Collections.unmodifiableList() 方法。
用 Collections.unmodifiableList 包装 ArrayList
这是标准推荐做法,它返回一个代理列表,所有修改操作(如 add、remove、set)都会抛出 UnsupportedOperationException。
示例:
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
List<String> readOnly = Collections.unmodifiableList(list);
readOnly.add("c"); // 运行时抛出 UnsupportedOperationException
注意:底层 ArrayList 仍可被修改
unmodifiableList 返回的是只读“视图”,不阻止原始 ArrayList 被修改。如果后续改动原列表,只读视图的内容也会变化(因为共享内部数组)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
如果需要真正隔离,应在包装前完成所有写入,或使用不可变集合库(如 Guava 或 Java 10+ 的 List.of())。
替代方案:Java 9+ 的 List.of()(真正不可变)
适用于已知元素且无需后续增删的场景,生成的列表是深度不可变的(包括不允许 null 元素):
-
List.of("a", "b", "c")—— 空间高效、线程安全、不可修改 - 若需从已有 ArrayList 构建,可用
List.copyOf(arrayList)(Java 10+),它会创建新副本并返回不可变视图
避免常见错误
- 不要直接继承 ArrayList 并重写修改方法 —— 易遗漏、不安全、破坏封装
- 不要仅靠命名(如
readOnlyList)而不加防护 —— 运行时无保障 - 如果用
Arrays.asList()得到的列表再套unmodifiableList,要注意前者本身就不支持add/remove

















