java中的Arrays.asList()返回引用列表到源数组?

时间:2014-09-24 09:09:59

标签: java

执行下面的代码后,我觉得Arrays.asList在打印后返回对源数组的引用,显示源数组中的最终内容。

String[] circus2 = { "Monkey", "Elephant" };
List<String> zoo2 = Arrays.asList(circus2);
circus2[1] = "bear";
System.out.println("zoo2 size: " + zoo2.size());
System.out.println("zoo2 : " + zoo2);

====

zoo2 size:2
zoo2 : [Monkey, bear]

如果我错了,请告诉我。 Java Document称它返回“返回一个固定大小的列表支持指定的数组。”。

3 个答案:

答案 0 :(得分:2)

doc的实际含义是,一旦将数组转换为列表,就可以只修改列表的现有内容(即后面的数组),但不能添加/删除元素。

public static void main(String[] args) {
    String[] str = new String[2];
    str[0] = "abc";
    str[1] = "def";
    List<String> l = Arrays.asList(str);
    l.set(0, "ghi");

    for (String s : str) {
        System.out.println(s);
    }
}

O / P:

ghi
def

但如果你尝试l.add("ppp");,那么你会收到错误。 为什么? - 因为Arrays.aslist()返回的 List Arrays类中的静态内部类(它不是java.util.ArrayList),因此,您将获得UnsupportedOperationException,因为某些应该被定义覆盖的方法实际上并未在静态内部类中被覆盖。

答案 1 :(得分:1)

正如api doc所说,Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.)

就像,源数组包含元素,列表是一种视图,如果更新了源数组,列表将读取更新的值。如果更新列表中的元素,元素也会在数组中更改。

请注意,在内部,返回的ArrayList不是java.util.ArrayList,而是ArrayList类中的内部类Arrays

答案 2 :(得分:0)

列表确实由数组支持。如果更改阵列,则更改列表:

String[] array = new String[] { "a", "b", "c" };
List<String> list = Arrays.asList(array);
array[0] = "asdf";
System.out.println(list.get(0)); // prints "asdf"

这也是相反的方法:

String[] array = new String[] { "a", "b", "c" };
List<String> list = Arrays.asList(array);
list.set(0, "asdf");
System.out.println(array[0]); // prints "asdf"

但是,您无法更改列表的大小。你可以自己试试。以下代码抛出java.lang.UnsupportedOperationException:

String[] array = new String[] { "a", "b", "c" };
List<String> list = Arrays.asList(array);
list.add("asdf");