Java中数组转Arrays.asList生成的List为何部分修改不生效?
Arrays.asList() 与原数组的关联机制解析
核心本质
Arrays.asList() 返回的并不是常用的 java.util.ArrayList,而是 Arrays 类内部的私有静态内部类 ArrayList。这个内部类没有独立的存储结构,直接持有传入数组的引用——所有对该List的元素读写操作,本质都是直接操作原数组;反过来修改原数组元素,也会直接反映到这个List上。
逐个解答你的疑问
为什么修改数组单个元素会同步到List?
这个内部List直接指向原数组的内存地址,修改数组元素就是修改List底层依赖的数据源,自然会同步显示在List中。重新赋值数组后List的指向是什么?为什么List仍关联原数组旧值?
执行nameListLinkedToArrayFixedSize = new String[]{"ead","sda","eps"};时,只是把变量本身的指向改成了新数组,但之前通过Arrays.asList()创建的List,持有的还是原来那个旧数组的引用——变量的指向变化不会影响已经存在的引用关系,所以List依然和旧数组绑定,不会同步新数组的内容。为什么修改List元素数组会同步,修改长度抛异常?
- List的
set()方法本质是直接修改底层数组对应索引的元素,所以数组会同步变化; - 这个内部ArrayList没有实现
add()、remove()等改变集合长度的方法,调用这些方法会直接抛出UnsupportedOperationException,因为它的大小完全由原数组长度决定,是固定不可变的。
- List的
代码示例解析
String[] nameListLinkedToArrayFixedSize = {"Jhonny","Joe","Jhoseph"}; // 创建的List直接持有上面这个数组的引用 List<String> nameListLinkedToArray = Arrays.asList(nameListLinkedToArrayFixedSize); // 修改原数组的元素,List同步变化——操作的是同一个数组 nameListLinkedToArrayFixedSize[1] = "J.Joe"; // 变量指向新数组,但List持有的还是旧数组引用,所以List内容不变 nameListLinkedToArrayFixedSize = new String[]{"ead","sda","eps"}; System.out.println(nameListLinkedToArray); // 输出 [Jhonny, J.Joe, Jhoseph] // List的set方法直接修改旧数组的第三个元素,数组同步更新 nameListLinkedToArray.set(2, "J.Jhoseph");
官方文档参考
查看JDK官方API文档中 java.util.Arrays 类的 asList(T... a) 方法说明即可,里面明确指出:
返回的List是原数组的一个视图,对List的修改会直接作用于数组,反之亦然;该List是固定大小的,不支持添加或删除元素的操作。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

