2012-04-09 6 views
2

java.util.CollectionsのaddAllメソッドの実装は、ソースコレクションをループし、ソースコレクション内の各要素の受信コレクションのaddメソッドを呼び出します。コレクションの基になるデータ構造が最大で1回だけサイズが変更されることを保証するコレクションaddAllユーティリティメソッドはありますか?

したがって、受信側のコレクションの容量が小さく、多数の要素を追加している場合は、受信側のコレクションの基礎となるデータ構造のサイズ変更が複数回発生する可能性があります。各サイズ変更はO(n)操作になります。

addAllメソッドを追加すると、追加する要素の数を確認し、受信コレクションの容量を最初に(必要に応じて)1回設定する必要があります。そのようなユーティリティメソッドは存在しますか?そうでない場合は、どうしてですか?

明確化:私は、この特定の動作を持つ実装固有のaddAllメソッド(ArrayListなど)があることを認識しています。私は、コレクションのすべての実装クラスで動作する方法でこの動作を取得するCollectionユーティリティクラスがあるのだろうかと思います。

答えて

4

このようなユーティリティメソッドは、汎用メソッドCollectionには存在しません。なぜなら、必要なメソッドensureCapacity(int)はどのインタフェースにもなく、そのためにいくつかのメリットがある実装にしかないからです。現在のところ、ArrayList,BitSetおよびVectorです。 ArrayListVectorの両方が調整addAllの方法を持っています。 BitSetCollection.addAllあなたが求めているように見える方法であるため、私は、あなたの明確化によって混乱している何か完全に異なる:-)

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

+0

はい、これはまさに私が話していることです。これはArrayListのためにうまく動作しますが、コレクションのユーティリティクラスがあるかどうかは不思議でした。これは、すべてのコレクションに対して機能するaddAllメソッドのサイズを変更するだけです。 答えから、コレクションの実装が互いに非常に異なるため、このようなユーティリティメソッドは存在しないようです。 – dasl

2

特定のコレクションの実装によって異なります。

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

しかし、LinkedListでは、各要素の末尾に追加するだけで済みます。非常に速くなる何か。

2

です。

+0

いいえ。初期容量が小さいコレクションに多数のオブジェクトが追加されている場合、java.util.Collections.addAllは基本データ構造のサイズを2倍以上にする可能性があります。それが私が避けようとしている行動です。 – dasl

+0

あなたはまだ誤解していると思います。私は 'Collections.addAll'ではなく、Collections.addAllと言いました。これにより、実装クラスは、それが行う方法を知っている最善のことを行うことができます。あなたはどうやってそれよりもうまくいくのですか? –

関連する問題