Arrays.asList() 返回的是不可变的 java.util.Arrays$ArrayList 视图,支持随机访问和元素替换但不支持增删,原始类型数组会整体作为单个元素,需用包装类或 Stream 处理,可变操作必须用 new ArrayList() 包装。

Arrays.asList() 是 Java 中最常用的数组转集合方法,但用错就容易在运行时崩溃。它不是“直接得到一个能增删的 ArrayList”,而是一个轻量级视图——快、省内存,但有明确边界。
它返回的到底是什么?
不是 java.util.ArrayList,而是 java.util.Arrays$ArrayList(Arrays 的静态内部类)。这个类继承 AbstractList,实现了 get/set/contains 等操作,但 add/remove/clear 方法直接抛 UnsupportedOperationException。
- 调用 list.getClass() 会打印:class java.util.Arrays$ArrayList
- 支持随机访问(实现 RandomAccess),适合只读遍历或元素替换
- 底层仍指向原数组,不是副本——修改 list.set(i, x) 会同步改原数组,反之亦然
基本类型数组千万别直接传
int[]、long[]、double[] 等原始类型数组传给 Arrays.asList(),会被整体当作单个 Object 元素处理:
- int[] arr = {1, 2, 3}; List list = Arrays.asList(arr); → size() == 1,get(0) 就是那个 int[] 对象
- 正确做法一:改用包装类数组,如 Integer[] arr = {1, 2, 3};
- 正确做法二:用 Stream 装箱,Arrays.stream(arr).boxed().collect(Collectors.toList())
String[] 或其他引用类型数组要注意 null
Arrays.asList(null) 会抛 NullPointerException;而 Arrays.asList((String[]) null) 同样崩溃。
立即学习“Java免费学习笔记(深入)”;
- 安全写法:先判空,再转换
- String[] arr = getNames(); List
list = arr == null ? Collections.emptyList() : Arrays.asList(arr); - 若数组含 null 元素,会被如实保留,后续 map 或 filter 操作可能触发 NPE,需提前处理
需要可变集合?必须“包一层”
只要后续要 add/remove/clear,就必须用 new ArrayList(...) 包装:
- List
mutable = new ArrayList(Arrays.asList("a", "b", "c")); - 这一步完成深拷贝(元素值复制),新 List 与原数组完全解耦
- 也可转其他集合:new HashSet(Arrays.asList(arr)) 实现去重;或用 Stream 支持链式处理


















