【问题标题】:ArrayList vs the List returned by Arrays.asList() [duplicate]ArrayList 与 Arrays.asList() 返回的列表 [重复]
【发布时间】:2014-11-01 23:38:48
【问题描述】:

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

我正在寻找Arrays.asList() 返回的对象和ArrayList 对象之间的区别——这是一个无需深入代码即可快速了解这些的来源。

TIA。

【问题讨论】:

标签: java arrays list arraylist


【解决方案1】:

当您调用 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。

【讨论】:

  • 它不是一成不变的。您可以使用 list.set(index,value)。你只是不能改变元素的数量
  • 这个答案有更好的解释。 stackoverflow.com/a/4659150/8123983
【解决方案2】:

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

如果您使用asList 可能会出现一个问题,因为它与ArrayList 对象没有什么不同:

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

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

List<Object> newList = new ArrayList<>(Arrays.asList(array));

为了使newList 可修改。

【讨论】:

  • 你不应该使用原始类型。
  • @MCEmperor 你是对的。我在回答中展示了其他内容,但无论如何都会编辑。
  • 此处来自“Java:如何编程”一书第 705 页,代码行 15-16,感谢您澄清差异。
  • 您可以使用set 方法按索引更改值,例如要更改索引 1 中的值,请使用 list.set(1, Object)。
猜你喜欢
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 2016-10-25
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2020-06-02
相关资源
最近更新 更多