繁体   English   中英

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

[英]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。

这样做的原因很简单:

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

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,但是不允许增长数组或缩小数组。

  1. 回应:

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

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

-dbednar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM