3

AbstractCollectionのaddAll()は次のように実装されます。

public boolean addAll(Collection<? extends E> c) { 
    boolean modified = false;
    for (E e : c) if (add(e)) modified = true; 
    return modified;
}

したがって、パラメーターのcがたとえば 3 つの要素のコレクションである場合、これらの要素の最初の 2 つが追加されている可能性がありますが、3 つ目は何らかの理由で追加されていません。

この場合、addAll()操作 -- これら 3 つの要素すべての基礎となる Collection への追加は実行されず、addAll()は必要に応じて false を返します。しかし、最初の 2 つの要素はそこにあります。

HashSetは、このaddAll()をコレクション型の単一パラメーターを持つコンストラクターで使用しています。

そのため、開発者は、コレクション全体を探しているときに、コレクションの一部を含むHashSetインスタンスになってしまう可能性があります。そして、これは警告なしに発生します。

関連するメソッド ( HashMapのput()HashSetadd() )は十分に単純に見えますが、これらの操作中に何か問題が発生する可能性はないように見えますが、それでもなお.

ここで何か不足していますか?

4

5 に答える 5

6

のコントラクトは、コレクション (this) が変更された場合Collection#addAll(...)に返されるとだけ言っています。true追加がアトミックまたは完全であることを保証するものではありません。

于 2013-07-31T23:18:26.370 に答える
5

この [すべての要素が追加されていない] ケースでは、addAll() 操作 -- これら 3 つの要素すべての基になる Collection への追加は実行されず、addAll() は必要に応じて false を返します。

addAll()の要素がすべて追加された場合ではなく、いずれかの要素が正常に追加されたtrue場合に返します。投稿したコードからこれを見ることができます:呼び出しが返されるとすぐにに設定されます。cmodifiedtrue add()true

于 2013-07-31T23:19:50.583 に答える
3

true他の人が既に述べたように、要素が正常に追加された場合、メソッドは戻ります。

さらに: http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#add(E)

コレクションが特定の要素を既に含んでいる以外の理由で追加を拒否した場合、(false を返すのではなく) 例外をスローする必要があります。これにより、この呼び出しが返された後、コレクションには常に指定された要素が含まれるという不変条件が保持されます。

したがって、提示された実装を考えるとaddAll、要素が追加されず、例外がスローされない場合、それは要素が既にコレクションにあったためです。

于 2013-07-31T23:28:28.067 に答える
1

javadocは、現在が変更された場合(そうでない場合)にaddAll戻ると述べています。trueCollectionfalse

これは、要素が 1 つだけ追加された場合でも、メソッドは を返すことを意味しtrueます。戻り値は、すべての要素が追加されたのではなく、メソッド呼び出しの結果としてこのコレクションが変更されたかどうかを示す指標と考えてください。

于 2013-07-31T23:19:21.617 に答える