0
        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 行修改

4

3 回答 3

7

Arrays.asList不会将数组复制到列表中 - 它会在数组上创建一个视图。您通过列表所做的任何更改都会影响数组,反之亦然。这就是为什么您不能添加到(或从中删除)由Arrays.asList- 返回的列表的原因,因为数组本身不能更改大小。

该文档在一个方向上清楚地说明了这一点:

返回由指定数组支持的固定大小的列表。(将返回的列表“写入”到数组的更改。)

...但它是双向的,因为该列表没有专门的后备存储。它实际上只是由数组支持。

于 2015-01-17T17:53:06.087 回答
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"};
于 2015-01-17T17:53:18.427 回答
2

Arrays.asList返回您传入的数组的“列表视图”。它不会复制数组。list.get(1),例如,只是委托给arr[1]。因此,当您继续更改数组元素时,您将继续隐式更改列表元素。

于 2015-01-17T17:53:20.440 回答