Java转换为列表后插入到数组中

时间:2015-01-17 17:51:27

标签: java java-collections-api

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

3 个答案:

答案 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]。因此,当您继续更改数组元素时,您将继续隐式更改列表元素。