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 に答える
2

特定のコレクションの実装に依存します。

たとえば、ArrayList の場合、配列サイズが 1 回増加します。また、通常はサイズが 2 倍になるため、10 回の呼び出しを行うと必ずしも 10 個の新しい配列を作成する必要はありません。

ただし、LinkedList の場合は、各要素の末尾に追加するだけです。非常に迅速に実行できるもの。

于 2012-04-09T14:40:52.890 に答える