arrays.aslist返回的list是原始数组的视图,共享内存,修改任一者另一方立即反映;支持get/set但不支持add/remove;需显式拷贝(如new arraylist(arrays.aslist(arr)))才能解除联动。

Arrays.asList 返回的 List 不是独立副本,而是原始数组的“视图”,二者共享同一块内存。修改其中任一者,另一方会立即反映变化——这是它最易被忽略、也最容易引发 bug 的特性。
修改 List 元素会改原数组
调用 set() 更新 List 中的元素,原数组对应位置的值同步变更:
- String[] arr = {"a", "b"};
- List
list = Arrays.asList(arr); - list.set(0, "x"); → arr[0] 变成 "x"
修改原数组也会改 List
反过来,直接操作数组,List 视图内容随之更新:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- String[] arr = {"hello", "world"};
- List
list = Arrays.asList(arr); - arr[1] = "Java"; → list.get(1) 返回 "Java"
增删操作不被允许,但 set 是安全的
该 List 支持 get() 和 set()(因为内部直接读写数组),但不支持 add()、remove() 或 clear():
- list.add("c") → 抛出 UnsupportedOperationException
- list.remove(0) → 同样抛出异常
- 这种限制源于其底层是 Arrays 内部类,未重写结构性修改方法
需要独立副本?必须显式拷贝
若不希望数组和 List 相互影响,不能依赖 asList 本身,而要创建新集合:
- 对象数组:new ArrayList(Arrays.asList(arr))
- 基本类型数组(如 int[]):先转为 Integer[],再套用上式;或用 Stream.of(arr).boxed().collect(Collectors.toList())
- 注意:List.copyOf(Arrays.asList(arr)) 在 Java 10+ 中仍返回不可变 List,不解决联动问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










