arrays.aslist()返回arrays.arraylist视图,不支持add等结构性操作,因未重写abstractlist中add方法而抛unsupportedoperationexception;需增删时应new arraylist包装。

Arrays.asList() 返回的不是真正的 ArrayList,而是一个固定长度的“视图”,底层直接映射原始数组。它不支持 add、remove、addAll、clear 等结构性修改操作,一调就抛 UnsupportedOperationException —— 这不是 bug,是设计使然。
为什么一调 add 就崩?
Arrays.asList() 创建的是 Arrays 类的静态内部类 ArrayList(注意:不是 java.util.ArrayList),它继承自 AbstractList,但没有重写 add()、remove() 等方法。这些方法在父类中默认直接抛异常:
-
add()、remove()、addAll()、removeAll()、retainAll()、clear()全部不支持 -
get()和set()是支持的,因为它们只是读/写原数组对应位置 - 数组长度不可变,所以任何改变元素个数的操作都会失败
哪些写法会踩坑?
以下代码看似合理,实际运行时全都会触发异常:
Arrays.asList("a", "b").add("c")Arrays.asList(1, 2, 3).removeIf(x -> x == 2)Arrays.asList("x", "y").addAll(Arrays.asList("z"))-
Collections.unmodifiableList(Arrays.asList("a"))再去改 —— 双重不可变,更不能动
安全转成可修改列表的方法
别试图“绕过限制”,唯一可靠方式是用它当数据源,新建一个真正的 ArrayList:
- 最常用:
new ArrayList(Arrays.asList("a", "b", "c")) - JDK 10+ 可简写为:
List.copyOf(Arrays.asList("a", "b"))(但注意:这个仍是不可变的!仅用于只读场景) - 若需后续增删,必须用
new ArrayList()构造 - 工具类替代(如 Hutool):
ListUtil.toList("a", "b", "c"),内部自动封装为java.util.ArrayList
顺便提醒:List.of() 更严格
和 Arrays.asList() 不同,List.of("a") 连 set() 都不支持,且禁止 null 元素。它返回的是 JDK 内部的不可变实现(如 ImmutableCollections.List12),所有修改方法一律抛 UnsupportedOperationException。需要可变时,同样得套一层:new ArrayList(List.of("a", "b"))。











