![](/img/trans.png)
[英]Whats does new ArrayList<>(Arrays.asList(...)) return?
[英]Why does Arrays.asList() return its own ArrayList implementation
我最近发现在Java中实际上有两种不同的ArrayList
实现(比我猜想的更好......)。
所以我想知道为什么Arrays.asList(T... a)
需要返回一个无法调整大小的列表? 如果他们需要一个不可修改的列表,那么为什么要添加set(int index, E element)
方法呢?
所以我的一般问题是为什么不从Arrays.asList(T... a)
方法返回java.util.ArrayList
?
您还可以使用java.util.Arrays.ArrayList
实现获得什么?
您询问:
您还可以使用java.util.Arrays.ArrayList实现获得什么?
这是因为Arrays.asList返回的Arrays $ ArrayList只是原始数组的一个视图。 因此,当更改原始数组时,视图也会更改。
如果使用真实的ArrayList,那么将复制元素,并且对orignal数组的更改不会影响ArrayList。
这样做的原因很简单:
javadoc说asList
返回“由指定数组支持的固定大小的列表”。 如果要调整阵列大小,则必须创建一个新阵列并复制旧数据。 比列表不会由同一个数组实例支持。 所述目标是“此方法充当基于阵列和基于集合的API之间的桥梁。” 因此,对底层数组的直写是一项设计要求。
它们是两个具有不同行为的不同类别。
调用Arrays.asList
时返回的列表是数组上的瘦包装,而不是副本。 返回的列表是固定大小:尝试调用add
将抛出UnsupportedOperationException
异常。
另一方面, java.util.ArrayList
保留了自己的数据内部副本,并且大小可变。
Arrays.asList需要返回一个无法调整大小的列表 - 因为底层数组不能调整大小 - 但这是可修改的 - 因为允许分配给底层数组中的元素。
实际上,您可以使用add向ArrayList添加元素。 像这样的方法:
List<String> l2= new ArrayList<String>(Arrays.asList(array1));
l2.add("blueCheese");
在我看来,你用它来获取List的功能,但将它们应用于数组。
两条评论:
1,尝试通过调用List接口的remove()方法缩小返回的数组将抛出UnsupportedOperationException。 这是因为Arrays类中的内部ArrayList类扩展了AbstractList,而AbstractList中的remove()方法抛出UnsupportedException。
因此,一旦返回List,您可以在数组中或在返回的List中过载现有元素EITHER,但是不允许增长数组或缩小数组。
实际上,您可以使用add向ArrayList添加元素。 像这样的方法:List l2 = new ArrayList(Arrays.asList(array1)); l2.add( “blueCheese”);
-dbednar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.