ArrayList与Arrays.asList()返回的List之间的区别

23

方法Arrays.asList(<T>...A)返回AList表示。 这里返回的对象是由数组支持的List,但不是一个ArrayList对象。

我正在寻找Arrays.asList()返回的对象与ArrayList对象之间的区别--一种快速了解这些差异而不必深入代码的来源。

TIA。


8
asList 方法返回一个由指定数组支持的固定大小的列表。 - Maroun
https://dev59.com/jG445IYBdhLWcg3w3N6z?rq=1 - Natix
2个回答

41

当您调用Arrays.asList时,它不会返回一个java.util.ArrayList。它返回一个java.util.Arrays$ArrayList,这是一个由原始源数组支持的固定大小列表。换句话说,它是一个视图,可通过Java的基于集合的API公开显示数组。

    String[] sourceArr = {"A", "B", "C"};
    List<String> list = Arrays.asList(sourceArr);
    System.out.println(list); // [A, B, C]

    sourceArr[2] = ""; // changing source array changes the exposed view List
    System.out.println(list); //[A, B, ]

    list.set(0, "Z"); // Setting an element within the size of the source array
    System.out.println(Arrays.toString(sourceArr)); //[Z, B, ]

    list.set(3, "Z"); // java.lang.ArrayIndexOutOfBoundsException
    System.out.println(Arrays.toString(sourceArr));

    list.add("X"); //java.lang.UnsupportedOperationException

    list.remove("Z"); //java.lang.UnsupportedOperationException

您无法向其添加元素,也无法从其中删除元素。如果尝试向它们添加或删除元素,则会收到 UnsupportedOperationException


7
它并非不可变的。您可以使用**list.set(index,value)**。但是您不能更改元素的数量。 - Назар Кулян
1
这个答案有更好的解释。https://dev59.com/jG445IYBdhLWcg3w3N6z#4659150 - S_K

31

我会稍微扩展一下我的评论。

如果你使用 asList 作为一个与 ArrayList 对象没有区别的替代品,就可能会发生一个问题:

List<Object> list = Array.asList(array) ;
list.remove(0); // UnsupportedOperationException :(

你不能删除第0个元素,因为asList方法返回的是由指定数组支持的固定大小的列表。所以你应该这样做:

List<Object> newList = new ArrayList<>(Arrays.asList(array));
为了使newList可以被修改。

你不应该使用原始类型。 - MC Emperor
@MCEmperor 您说得对。我在我的回答中演示了其他内容,但无论如何都会进行编辑。 - Maroun
这里来自《Java编程入门》第705页,代码行15-16,感谢对差异的澄清。 - christianbueno.1
你可以使用 set 方法通过索引来改变值,例如要更改索引 1 中的值,请使用 list.set(1, Object) - christianbueno.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接