arrays.aslist返回的是固定大小的只读视图,底层为arrays.arraylist(非java.util.arraylist),不支持add/remove;基本类型数组整体作为单元素;列表与原数组双向联动;需增删操作时须包装为arraylist等可变集合。

Arrays.asList 返回的是固定大小列表
它返回的不是 java.util.ArrayList,而是 java.util.Arrays 类里的一个私有静态内部类(也叫 Arrays.ArrayList)。这个类继承自 AbstractList,但没有重写 add、remove、clear 等结构修改方法,所有这些方法默认都抛出 UnsupportedOperationException。
它的底层直接持有一个数组引用,size() 就是原数组长度,不支持扩容或缩容——本质上是一个“只读尺寸、可改内容”的视图。
基本类型数组会整体变成单个元素
泛型机制不支持基本类型,所以 int[]、long[]、double[] 这类传给 Arrays.asList() 时,不会被自动拆成多个元素,而是整个数组对象被当作**唯一一个元素**放进列表。
-
int[] arr = {1, 2, 3}; List<int> list = Arrays.asList(arr);</int>→ 列表大小为 1,元素是arr这个数组引用 - 正确做法是用包装类型数组:
Integer[] arr = {1, 2, 3}; List<integer> list = Arrays.asList(arr);</integer>
列表与原数组双向联动,修改相互可见
返回的列表不是原数组的副本,而是共享同一块内存。对列表调用 set(index, e),原数组对应位置立即改变;反过来,直接改原数组某个元素,列表里读出来也是新值。
如果需要独立副本,必须显式复制:
List<string> safeList = new ArrayList(Arrays.asList(array));</string>- 或用
Arrays.stream(array).collect(Collectors.toList())(Java 8+)
想增删?得包装一层可变容器
只要需要 add、remove、addAll 等操作,就不能直接用 Arrays.asList() 的返回值,必须转成真正的 ArrayList 或其他可变集合。
- 最常用:
new ArrayList(Arrays.asList(array)) - 若只是临时添加几个元素,也可用
Collections.addAll(new ArrayList(), array) - 流式构造(推荐用于 Java 8+):
Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











