java.util.Collections中addAll方法的实现只是循环遍历源集合,并为源集合中的每个元素调用接收集合的add方法。
因此,如果接收集合的容量很小并且我们正在向其添加许多元素,则可以多次调整接收集合的基础数据结构的大小。每个调整大小都是O(n)操作。
似乎应该存在一个好的集合addAll方法,它将检查我们将添加的元素的数量,并在开始时设置接收集合的容量(如果需要)。这样的实用方法是否存在?如果没有,为什么不呢?
澄清:我意识到存在具有此期望行为的特定于实现的addAll方法(如在ArrayList中)。我想知道是否有Collection实用程序类将以一种适用于所有Collection实现类的方式获取此行为。
答案 0 :(得分:8)
您正在谈论哪个系列?我看到了,例如ArrayList
执行以下操作:
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacity(size + numNew);
System.arraycopy(a, 0, elementData, size, numNew);
//...
}
这似乎是你想要的行为。
答案 1 :(得分:4)
对于通用Collection
,这样的实用程序方法不存在,因为必要的方法ensureCapacity(int)
不在任何接口中,而只在具有某些优点的实现上。目前,这是ArrayList
,BitSet
和Vector
。 ArrayList
和Vector
都有调整后的addAll
方法。 BitSet
完全不同: - )
答案 2 :(得分:2)
这取决于具体的集合实现。
例如,对于ArrayList,它将增加一次数组大小。通常它的大小加倍,因此进行10次调用并不总是需要创建10个新阵列。
但是对于LinkedList,它只需要追加到每个元素的末尾。可以做得非常快的东西。
答案 3 :(得分:2)
我对您的澄清感到困惑,因为Collection.addAll
是您似乎要求的方法。