为什么Arrays.asList()返回自己的ArrayList实现

时间:2011-01-11 14:51:33

标签: java arrays collections arraylist

我最近发现在Java中实际上有两种不同的ArrayList实现(比我猜想的要好得多......)。

所以我想知道为什么Arrays.asList(T... a)需要返回一个无法调整大小的列表?如果他们需要一个不可修改的列表,那么为什么要添加set(int index, E element)方法?

所以我的一般问题是为什么不从java.util.ArrayList方法返回Arrays.asList(T... a)

您还可以通过java.util.Arrays.ArrayList实施获得什么?

6 个答案:

答案 0 :(得分:47)

你问:

  

你还能获得什么?   java.util.Arrays.ArrayList   实施?

这是因为Arrays.asList返回的Arrays $ ArrayList只是原始数组的一个视图。因此,当更改原始数组时,视图也会更改。

如果使用真实的ArrayList,则会复制元素,并且对orignal数组的更改不会影响ArrayList。

这样做的原因很简单:

  • 表现:无需复制任何
  • 内存效率:不需要第二个阵列

答案 1 :(得分:12)

javadoc说asList返回“由指定数组支持的固定大小的列表”。如果要调整阵列大小,则必须创建一个新阵列并复制旧数据。比列表不会由同一个数组实例支持。所述目标是“此方法充当基于阵列和基于集合的API之间的桥梁。”因此,对底层数组的直写是一项设计要求。

答案 2 :(得分:6)

他们是两个有不同行为的不同类别。

调用Arrays.asList时返回的列表是数组上的瘦包装,而不是副本。返回的列表是固定大小的:尝试调用add会抛出UnsupportedOperationException异常。

另一方面,java.util.ArrayList保留了自己的数据内部副本,并且大小可变。

答案 3 :(得分:5)

Arrays.asList需要返回一个无法调整大小的列表 - 因为底层数组无法调整大小 - 但这是可修改的 - 因为允许分配给底层数组中的元素。

答案 4 :(得分:3)

实际上你可以使用add向ArrayList添加元素。像这样的方法:

List<String> l2= new ArrayList<String>(Arrays.asList(array1));
l2.add("blueCheese");

在我看来,你用它来获取List的功能,但是将它们应用到数组中。

答案 5 :(得分:1)

两条评论:

1,尝试通过调用List接口的remove()方法缩小返回的数组将抛出UnsupportedOperationException。这是因为Arrays类中的内部ArrayList类扩展了AbstractList,而AbstractList中的remove()方法抛出了UnsupportedException。

因此,一旦返回List,您就可以在数组中或在返回的List中过度使用现有元素,但是不允许增长数组或缩小数组。

  1. 回应:

      

    实际上你可以使用add向ArrayList添加元素。像这样的方法:   List l2 = new ArrayList(Arrays.asList(array1));   l2.add( “blueCheese”);

  2.      l2是列表的独立副本,因此List l2现在与原始数组&amp; List分离。所以blueCheese在l2中,但不是在彼此备份的原始数组/列表中。

    -dbednar