String[] arr = { "Java", "Champ", "." };
List<String> list = (List<String>) Arrays.asList(arr); // line 1
arr[2] = ".com"; // line 2
for (String word : list) {
System.out.print(word);
}
此结果如何输出为JavaChamp.com
,即使它在第1行转换为List并在第2行中修改
答案 0 :(得分:7)
Arrays.asList
不会将数组复制到列表中 - 它会在数组中创建视图。您通过列表进行的任何更改都会影响数组,反之亦然。这就是为什么你不能添加(或删除)Arrays.asList
返回的列表的原因 - 因为数组本身不能改变大小。
文档在一个方向上明确了这一点:
返回由指定数组支持的固定大小的列表。 (对返回列表的更改“直写”到数组。)
...但它有两种方式,因为列表没有专用的后备存储。它实际上只是由阵列支持。
答案 1 :(得分:4)
来自Arrays.asList()的JavaDoc:
返回由指定数组支持的固定大小的列表。
这意味着您的List<String>
仍由数组支持。因此,如果更改数组,则更改列表中的内容。
编辑,为了获得额外的乐趣,您可以反过来做同样的事情:
String[] arr = { "Java", "Champ", "." };
List<String> list = (List<String>) Arrays.asList(arr); // line 1
arr[2] = ".com"; // line 2
list.set(0, "Foo"); // Array is now {"Foo", "Champ", ".com"};
答案 2 :(得分:2)
Arrays.asList
返回&#34;列表视图&#34;你传入的数组。它不会复制数组。例如,list.get(1)
只代表arr[1]
。因此,当您继续更改数组元素时,您将继续隐式更改列表元素。