arrays.aslist返回固定大小的不可变列表,仅支持读取和替换操作,不支持增删;基本类型数组会被整体封装为单元素,需用包装类或stream转换;数组与列表内存共享,修改任一端同步生效;需可变列表时须显式复制为arraylist。

Arrays.asList 不是万能的“数组转列表”快捷键,它返回的是一个与原数组深度绑定的固定视图,用错地方容易抛出 UnsupportedOperationException。关键不在“能不能转”,而在“转完之后能做什么”。
返回的 List 是固定大小的,不能增删元素
它底层是 java.util.Arrays$ArrayList(注意不是 java.util.ArrayList),只支持读取、替换和查询,不支持结构性修改:
- 允许的操作:get()、set()、contains()、indexOf()、size()、iterator()
-
禁止的操作:add()、remove()、clear()、addAll() —— 调用即抛
UnsupportedOperationException - 常见误用:直接对
Arrays.asList(arr).add(x)写法编译通过但运行报错
基本类型数组会整体变成一个元素
泛型机制不支持基本类型,int[]、double[] 等传入后被当作单个对象处理:
- 错误写法:
int[] nums = {1,2,3}; List<int> list = Arrays.asList(nums);</int>→list.size()是 1,list.get(0)就是那个int[]数组本身 - 正确做法:改用包装类数组,如
Integer[] nums = {1,2,3}; List<integer> list = Arrays.asList(nums);</integer> - 替代方案(Java 8+):
Arrays.stream(nums).boxed().collect(Collectors.toList())
数组和列表内容双向同步
它们共享同一块内存,修改任一端都会立刻反映到另一端:
-
String[] arr = {"a","b"}; List<string> list = Arrays.asList(arr); list.set(0, "x");</string>→arr[0]变为"x" -
arr[1] = "y";→list.get(1)也变成"y" - 多线程环境下需额外加锁,否则可能引发数据不一致
需要可变列表?必须显式复制一份
如果后续要 add/remove 元素,唯一安全做法是用新容器包装:
- 推荐写法:
List<string> mutable = new ArrayList(Arrays.asList("a","b","c"));</string> - 等价于先创建不可变视图,再拷贝进新
ArrayList,获得完整集合能力 - 避免写成
new ArrayList(list)之前没确认list是否来自asList,否则仍可能踩坑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











