执行下面的代码后,我觉得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称它返回“返回一个固定大小的列表由支持指定的数组。”。
答案 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");