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

Sim*_*eon 42 java arrays collections arraylist

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

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

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

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

Ral*_*lph 50

您询问:

您还可以使用java.util.Arrays.ArrayList实现获得什么?

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

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

这样做的原因很简单:

  • 表现:无需复制任何内容
  • memory efficent:不需要第二个数组


sbl*_*ndy 13

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


Mar*_*ers 6

它们是两个具有不同行为的不同类别.

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

java.util.ArrayList另一方面,保持数据的其自身的内部复制和可变大小.


Dav*_*sta 5

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