arrays.aslist()返回的list不可增删元素,是原数组的视图,基本类型数组会被整体当作单个元素,传入null会抛npe,需判空或包装为可变集合。

Arrays.asList() 返回的 List 不能 add/remove 元素
它返回的是 Arrays 内部的一个静态嵌套类 ArrayList(注意:不是 java.util.ArrayList),该类直接包装原始数组,不支持结构性修改。调用 add()、remove()、clear() 会抛出 UnsupportedOperationException。
常见错误现象:
- 代码编译通过,但运行时报
java.lang.UnsupportedOperationException - 误以为“转成 List 就能当普通集合用”,结果在后续逻辑中意外崩溃
正确做法是立即包装为可变集合:
String[] arr = {"a", "b", "c"};
List<string> list = new ArrayList(Arrays.asList(arr)); // ✅</string>
基本类型数组传给 Arrays.asList() 会被整体当作一个元素
Arrays.asList() 的泛型参数是 T...,而基本类型(如 int[])本身是引用类型,所以整个数组被当成单个 Object 元素塞进 List。
错误示例:
int[] nums = {1, 2, 3};
List<int> list = Arrays.asList(nums); // list.size() == 1,不是 3</int>
解决方式只有两种:
- 改用包装类型数组:
Integer[] nums = {1, 2, 3};→Arrays.asList(nums)才返回含 3 个元素的 List - 用 Java 8+ 流式转换:
Arrays.stream(nums).boxed().collect(Collectors.toList())
Arrays.asList() 对 null 数组的处理很危险
如果传入 null,它不会判空,而是直接用 null 初始化内部数组,导致后续调用 size() 或遍历时触发 NullPointerException。
典型场景:
- 从外部接口或配置读取数组,未做非空校验就直接
Arrays.asList(arr) - 方法参数允许为
null,但文档没写清约束
安全写法必须显式判空:
String[] arr = getArrayFromSomewhere(); List<string> list = arr == null ? Collections.emptyList() : Arrays.asList(arr);</string>
Arrays.asList() 与原数组内容是双向绑定的
返回的 List 是原数组的“视图”,修改 List 中的元素(如 list.set(0, "x"))会同步反映到原数组;反之亦然。这不是 bug,是设计使然。
影响点:
- 如果你后续还要用原数组,且不希望被 List 操作污染,必须复制一份:
String[] copy = arr.clone(); Arrays.asList(copy) - 多线程环境下更需警惕——没有同步机制,共享数组 + List 视图极易引发竞态
这种引用关系常被忽略,尤其在封装工具方法时,容易把“转成 List”等同于“获得独立副本”。










