Arrays.asList()返回的列表不可修改,因其内部使用私有静态类ArrayList直接包装原数组,而数组长度固定,故add、remove、clear等结构性操作均抛出UnsupportedOperationException。

使用 Arrays.asList() 返回的列表是固定大小的,且不支持添加、删除等结构性修改操作,调用 add()、remove()、clear() 等方法会抛出 UnsupportedOperationException。
为什么返回的列表不可修改?
Arrays.asList() 内部返回的是一个私有静态类 ArrayList(注意:不是 java.util.ArrayList),它直接包装传入的数组,所有操作都映射到原数组上。由于数组长度固定,该列表自然无法扩容或缩容,因此禁止结构性修改。
常见误解是以为它和 java.util.ArrayList 行为一致,但实际上二者毫无继承关系,仅名字相同。
哪些操作会触发异常?
以下方法在调用时会立即抛出 UnsupportedOperationException:
-
add(E e)和add(int index, E element) -
remove(int index)、remove(Object o)、clear() -
retainAll(Collection>)、removeAll(Collection>)
而读取类操作(如 get()、set()、contains()、size())均正常工作;set() 甚至能修改原数组对应位置的值。
如何获得可修改的列表?
若需后续增删元素,应将 Arrays.asList() 的结果作为构造参数,创建新的 java.util.ArrayList:
List<string> mutableList = new ArrayList(Arrays.asList("a", "b", "c"));</string>
其他常见安全写法包括:
- 用
Stream.of(...).collect(Collectors.toList())(Java 8+) - 用
List.of(...)(Java 9+)生成不可变列表,再显式包装为new ArrayList(...) - 手动遍历数组,逐个
add()到新ArrayList
特别注意 set() 的副作用
Arrays.asList().set(index, element) 不会报错,但它会直接修改原始数组的内容。例如:
String[] arr = {"x", "y"};<br>List<String> list = Arrays.asList(arr);<br>list.set(0, "z");<br>// 此时 arr[0] 已变为 "z"
这种共享底层数据的行为容易引发隐蔽 bug,尤其在多处复用同一数组时,务必留意。
















