Arrays.asList() 返回固定大小的 List,因其实现类未重写 add/remove 方法,调用会抛 UnsupportedOperationException;正确方式是用 new ArrayList(Arrays.asList(arr)) 等显式构造可变实例。

不能直接用 Arrays.asList() 得到可变的 ArrayList —— 它返回的是固定大小的 List,增删操作会抛 UnsupportedOperationException。
为什么 Arrays.asList() 返回的 List 不能 add/remove?
它返回的是 Arrays 类的一个私有静态内部类 ArrayList(注意:不是 java.util.ArrayList),该类只实现了 List 接口的读取和修改已有元素方法(如 set()),但未重写 add()、remove() 等结构变更方法,调用时直接抛异常。
常见错误现象:
-
list.add("new")→ 抛UnsupportedOperationException -
list.remove(0)→ 同样抛异常 - 看起来像
ArrayList,但list instanceof ArrayList为false
正确创建可修改的 ArrayList 的三种方式
核心原则:必须显式构造新的 java.util.ArrayList 实例。
立即学习“Java免费学习笔记(深入)”;
- 推荐:用构造器包装
Arrays.asList():String[] arr = {"a", "b", "c"};
Listlist = new ArrayList<>(Arrays.asList(arr)); - JDK 8+ 可用
Stream(适合链式处理):List
(注意:list = Arrays.stream(arr).collect(Collectors.toList()); Collectors.toList()不保证返回ArrayList,如需确定类型,改用Collectors.toCollection(ArrayList::new)) - 手动循环添加(最直观,兼容性最好,适合老 JDK 或需要条件过滤时):
List
list = new ArrayList<>();
for (String s : arr) list.add(s);
原始类型数组(如 int[])不能直接转 List
Arrays.asList(intArr) 会把整个 int[] 当作一个元素,返回 List,而非你想要的 List。
正确做法(JDK 8+):
int[] intArr = {1, 2, 3};
List list = Arrays.stream(intArr).boxed().collect(Collectors.toList());
或手动转换:
Listlist = new ArrayList<>();
for (int i : intArr) list.add(i);
注意:boxed() 是关键,否则 IntStream 无法转为 Stream。
真正容易被忽略的点是:数组类型与泛型擦除的交互。比如 String[] 转 List 看似简单,但一旦混入 null 或涉及子类数组(如 Object[] 存 String),Arrays.asList() 的行为仍受限于其底层实现——它不复制元素,只是包装引用。所以别指望靠它绕过不可变性约束。







