是否有一个集合addAll实用程序方法,可以确保集合的基础数据结构最多只调整一次大小?

时间:2012-04-09 14:29:59

标签: java collections

java.util.Collections中addAll方法的实现只是循环遍历源集合,并为源集合中的每个元素调用接收集合的add方法。

因此,如果接收集合的容量很小并且我们正在向其添加许多元素,则可以多次调整接收集合的基础数据结构的大小。每个调整大小都是O(n)操作。

似乎应该存在一个好的集合addAll方法,它将检查我们将添加的元素的数量,并在开始时设置接收集合的容量(如果需要)。这样的实用方法是否存在?如果没有,为什么不呢?

澄清:我意识到存在具有此期望行为的特定于实现的addAll方法(如在ArrayList中)。我想知道是否有Collection实用程序类将以一种适用于所有Collection实现类的方式获取此行为。

4 个答案:

答案 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)不在任何接口中,而只在具有某些优点的实现上。目前,这是ArrayListBitSetVectorArrayListVector 都有调整后的addAll方法。 BitSet完全不同: - )

答案 2 :(得分:2)

这取决于具体的集合实现。

例如,对于ArrayList,它将增加一次数组大小。通常它的大小加倍,因此进行10次调用并不总是需要创建10个新阵列。

但是对于LinkedList,它只需要追加到每个元素的末尾。可以做得非常快的东西。

答案 3 :(得分:2)

我对您的澄清感到困惑,因为Collection.addAll 是您似乎要求的方法。

相关问题