我在理解这一点时遇到了问题。
而我们做
List<Integer> list = Arrays.asList(array);
我们不能在该列表中使用add、remove等方法。我知道Arrays.asList()返回一个固定大小的列表。
我不明白的是,如果我们创建一个像一样指定初始容量的列表
List<Integer> list2 = new ArrayList<Integer>(10);
我们可以执行该列表上的所有操作。固定大小的列表和指定初始容量的列表之间有什么区别?
我读过很多关于这方面的答案,但很难理解。有人能解释一下吗?
谢谢。
Arrays.asList(array)
返回类型为java.util.Arrays.ArrayList
的对象,该对象不支持添加和删除操作。
而下面的代码将返回一个类型为java.util.ArrayList
的对象,该对象支持添加和删除操作。
List<Integer> list2 = new ArrayList<Integer>(10);`
很简单,Arrays.asList
就是这样,您就可以将List
方法与数组一起使用。ArrayList(int)
适用于需要创建一个非常大的ArrayList
并希望帮助加快速度的情况。
更详细地说:asList
返回的List
旨在作为数组的包装器。由于无法调整数组的大小,因此无法实现更改List
大小的方法。大多数时候,我只是简单地使用asList
将固定数量的元素添加到集合中。例如
new ArrayList<String>(Arrays.asList("hello", "world"));
令人困惑的是,ArrayList
的实现非常相似——它是一个由数组支持的List
。但是,ArrayList
允许您更改其大小。为此,它保留了一个单独的字段,分别表示列表中有多少对象和支持数组的长度。添加一个元素,ArrayList
只将array[size]
设置为该元素,然后递增size
字段。但是如果array[size]
超出了范围呢?此时,ArrayList
创建了一个新的、更大的阵列,并复制以前备份阵列中的元素。但是,如果您正在创建一个大型List
,那么不断创建新的备份阵列可能会开始占用大量时间。因此,如果您知道List
中的元素的大致数量,则可以使用它来通知ArrayList
它应该创建的初始备份阵列的大小。这就是ArrayList(int)
构造函数的作用。只有在特殊情况下,您才需要担心给ArrayList
一个长度提示。