2

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

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

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

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

4

4 回答 4

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);
    //...
}

这似乎正是您想要的行为。

于 2012-04-09T14:32:37.440 回答
4

这样的实用方法不能用于泛型Collection,因为必要的方法ensureCapacity(int)不在任何接口中,而仅在对此有一些好处的实现上。目前这是ArrayList,BitSetVector。两者ArrayList都有调整Vector 方法addAllBitSet是完全不同的东西:-)

于 2012-04-09T14:58:38.130 回答
2

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

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

但是对于 LinkedList 它只需要附加到每个元素的末尾。做起来会非常快的事情。

于 2012-04-09T14:40:52.890 回答
2

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

于 2012-04-09T16:41:11.103 回答