我最近发现在Java中实际上有两种不同的ArrayList
实现(比我猜想的要好得多......)。
所以我想知道为什么Arrays.asList(T... a)
需要返回一个无法调整大小的列表?如果他们需要一个不可修改的列表,那么为什么要添加set(int index, E element)
方法?
所以我的一般问题是为什么不从java.util.ArrayList
方法返回Arrays.asList(T... a)
?
您还可以通过java.util.Arrays.ArrayList
实施获得什么?
答案 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中过度使用现有元素,但是不允许增长数组或缩小数组。
实际上你可以使用add向ArrayList添加元素。像这样的方法: List l2 = new ArrayList(Arrays.asList(array1)); l2.add( “blueCheese”);
-dbednar