1

私はJavaが初めてで、ハッシュセットに疑問があります。

イテレータを作成した後に重複する要素を追加した場合に ConcurrentModificationException が発生しない理由を誰かが説明してくれませんか。とにかく構造を変更しているので、重複した要素を追加しても例外をスローする必要があります。誰か私の疑いを晴らしてくれませんか..

4

3 に答える 3

7

重複する要素を追加しても、セットは変更されません。定義により、セットには各要素が 1 つしか含まれないためです。これはSet.addの javadoc に記載されています。

指定された要素がまだ存在しない場合は、このセットに追加します。より正式には、このセットに (e==null ? e2==null : e.equals(e2)) となる要素 e2 が含まれていない場合、指定された要素 e をこのセットに追加します。このセットにすでに要素が含まれている場合、呼び出しはセットを変更せずに false を返します。

于 2013-07-26T11:54:12.303 に答える
2

ドキュメントから:

このクラスの iterator および listIterator メソッドによって返される反復子はフェイルファストです。反復子の作成後にリストが構造的に変更された場合、反復子自体の remove または add メソッド以外の方法で、反復子は ConcurrentModificationException をスローします。したがって、同時変更に直面した場合、反復子は、将来の不確定な時点で恣意的で非決定論的な動作を危険にさらすのではなく、迅速かつ明確に失敗します。

イテレータのフェイルファスト動作は保証できないことに注意してください。一般的に言えば、同期されていない同時変更が存在する場合にハードな保証を行うことは不可能であるためです。フェイルファスト イテレーターは、ベスト エフォート ベースで ConcurrentModificationException をスローします。したがって、その正確性をこの例外に依存するプログラムを作成するのは誤りです。反復子のフェイルファスト動作は、バグを検出するためだけに使用する必要があります。

于 2013-07-26T11:54:12.913 に答える