Arrays.asList 返回的是 java.util.Arrays$ArrayList,一个继承 AbstractList 的固定大小视图,支持 get/set/contains/遍历,但 add/remove/clear 会抛 UnsupportedOperationException。

Arrays.asList 是 Java 中最常用也最容易误用的数组转集合工具。它不创建新集合,而是返回一个绑定原数组的固定大小视图——用对了省事,用错了运行时报错。
Arrays.asList 返回的是什么?
它返回的不是 java.util.ArrayList,而是 java.util.Arrays$ArrayList(Arrays 的静态内部类)。这个类继承 AbstractList,支持 get、set、contains 和遍历,但所有结构性操作(add、remove、clear)都会抛出 UnsupportedOperationException。
- 调用 list.getClass() 可确认类型:class java.util.Arrays$ArrayList
- 它实现了 RandomAccess 和 Serializable,适合只读场景或快速初始化
- 底层直接引用原数组,因此 set(i, x) 会同步修改原数组对应位置
基本类型数组必须绕开
传入 int[]、long[]、double[] 等原始类型数组时,泛型机制无法拆箱,整个数组会被当作单个 Object 元素处理:
- int[] arr = {1, 2, 3}; List list = Arrays.asList(arr); → list.size() == 1,get(0) 就是那个 int[] 对象
- 正确做法一:用包装类数组,如 Integer[] boxed = {1, 2, 3}; Arrays.asList(boxed)
- 正确做法二:用 Stream 转换,Arrays.stream(arr).boxed().collect(Collectors.toList())
需要增删改?必须“包一层”
如果后续要 add、remove、addAll 或传给 MyBatis 批量插入等要求可变集合的框架,不能直接用 asList 结果:
立即学习“Java免费学习笔记(深入)”;
- ✅ 推荐写法:new ArrayList(Arrays.asList("a", "b", "c"))
- ✅ 这会拷贝元素到新 ArrayList,脱离原数组,获得完整 List 能力
- ❌ 错误写法:Arrays.asList("a", "b").add("c") —— 直接崩溃
String[] 使用注意 null 边界
String 是引用类型,Arrays.asList 能正常展开,但两类 null 情况需主动防护:
- Arrays.asList((String[]) null) → 抛 NullPointerException(参数为 null)
- Arrays.asList(null) → 返回含一个 null 元素的 List(合法但易引发后续 NPE)
- 建议:使用前判空 if (strArray != null),再调用;流式处理时用 Objects::nonNull 过滤


















