arrays.aslist()返回的是固定大小、双向绑定的视图列表,add()/addall()/remove()/removeall()/retainall()/clear()均抛unsupportedoperationexception;get()/set()/size()/contains()/indexof()/toarray()安全可用;基本类型数组会被整体视为单个元素;需可变列表时应使用new arraylist(arrays.aslist(arr))。

Arrays.asList() 返回的不是真正的 ArrayList,而是一个固定大小、与原数组双向绑定的视图列表。它适合快速初始化和只读场景,但增删操作会直接失败,基本类型数组还会被整体当做一个元素——用错就容易在运行时翻车。
哪些操作会报 UnsupportedOperationException?
这个“受限列表”继承自 AbstractList,但没重写结构性修改方法,所以以下调用一律抛异常:
- add() 和 addAll():无法插入新元素,数组长度固定
- remove()、removeAll()、retainAll():删除操作不被支持
- clear():清空整个列表也不允许
哪些操作是安全且常用的?
查询和已有元素更新完全没问题,性能也高(O(1) 随机访问):
- get(i) 和 set(i, e):可读可改,且 set 会同步更新原数组对应位置
- size()、contains()、indexOf():查找类操作照常使用
-
toArray():可反向转回数组,比如
list.toArray(new String[0])
基本类型数组的典型陷阱
传入 int[] arr = {1,2,3},Arrays.asList(arr) 得到的是一个大小为 1 的 List<int></int>,不是你想要的三个 Integer 元素。
- 正确做法一:改用包装类数组 ——
Integer[] arr = {1,2,3} - 正确做法二(Java 8+):用 Stream 装箱 ——
Arrays.stream(arr).boxed().collect(Collectors.toList()) - 错误示范:
Arrays.asList(new int[]{1,2,3})→ 列表里只有一个 int[] 对象
如何获得真正可变的 List?
如果后续要 add/remove,必须脱离原始数组,创建独立副本:
- 推荐:
new ArrayList(Arrays.asList(arr))—— 简洁、语义清晰、通用性强 - 替代方案:
new LinkedList(Arrays.asList(arr))(适合频繁首尾插入) - 注意避开:
List.copyOf(Arrays.asList(arr))(Java 10+,返回不可变集合)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











