arrays.aslist 是视图适配器,返回不可变的 arrays$arraylist;基本类型数组会被整体封装为单元素;对象数组与列表共享底层数据;需可变列表时须用 new arraylist 包装。

Arrays.asList 是 Java 中最常用也最容易踩坑的数组转列表工具。它不是万能转换器,而是一个有明确边界、行为特殊的“视图适配器”——用对了省事,用错了 runtime 报错、数据错乱、线上故障都可能找上门。
Arrays.asList 返回的是不可变结构
它返回的 List 实际是 java.util.Arrays$ArrayList(Arrays 的私有内部类),而非我们熟悉的 java.util.ArrayList。这个类继承 AbstractList,但没重写 add/remove/clear 等方法,调用时直接抛出 UnsupportedOperationException。
- 支持 set(index, element) 修改已有元素值
- 支持 get、size、contains 等只读操作
- 不支持 add、remove、addAll、clear 等结构性修改
基本类型数组会“失效”
传入 int[]、double[]、boolean[] 等基本类型数组时,整个数组会被当作单个 Object 元素处理,导致 List 大小恒为 1,内容是该数组引用。
- ❌ 错误写法:
Arrays.asList(new int[]{1,2,3})→ 得到[I@xxx(一个 int[] 对象) - ✅ 正确写法:
Arrays.asList(1, 2, 3)或Arrays.asList(new Integer[]{1,2,3}) - 包装类数组(Integer[]、Double[])才能正确展开为多个元素
数组与列表共享底层数据
Arrays.asList 返回的 List 是原数组的一个实时视图,二者共用同一块内存。修改任一端的元素值,另一端立即可见。
- 修改 list.set(0, "X") → 原字符串数组第 0 位同步变为 "X"
- 修改 arr[1] = "Y" → list.get(1) 也变成 "Y"
- 这种联动仅对对象数组生效;基本类型数组因被整体封装,无法触发此行为
需要可变列表?必须显式复制
若业务逻辑涉及增删元素(如后续添加日志项、过滤后追加默认值),务必用 new ArrayList(...) 构造新实例:
List<string> mutable = new ArrayList(Arrays.asList(arr));</string>- 此时 mutable 是独立副本,与原数组完全解耦
- add/remove/set 均可安全执行,不影响原始数组
- 注意:仅复制引用,若元素本身是可变对象(如自定义类),仍需考虑深拷贝
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











