11

私は2つのクラスの違いを調べていました.この点は、このブログがソースである多くの回答で出てきました: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and. html

しかし、私はそれを完全には理解していません。誰かがこれを詳しく説明できますか?おそらく例で?

ご覧いただきありがとうございます。

4

3 に答える 3

16

フェイルファストとは、反復処理中にコンテンツを変更しようとすると、失敗して ConcurrentModificationException をスローすることを意味します。

Set keys = hashMap.keySet();
for (Object key : keys) {
    hashMap.put(someObject, someValue); //it will throw the ConcurrentModificationException here
} 

HashTable 列挙の場合:

 Enumeration keys = hashTable.keys();
 while (keys.hasMoreElements()) {
          hashTable.put(someKey, someValue);  //this is ok
    }
于 2012-01-05T22:58:45.640 に答える
5

おそらく最善の方法は、各クラスの Open JDK 実装によって実装されている各クラスのソースを調べることです。そうすれば、いわば馬の口から直接答えを得ることができます:-)

それはさておき、本質的に、この意味での「フェイルファスト」は、別のスレッドがターゲットの HashMap を変更したことを検出した場合、HashMap の Iterator が例外をスローすることを意味します。HashMap のソースを見ると、これが予想される変更の数についてカウンターをチェックするだけで実行できます。変更カウントが Iterator が期待するものと異なる場合は、最後のチェック以降に別の誰かが入ってきて、HashMap をいじったことを意味するため、Iterator はConcurrentModificationExceptionをスローします。

「フェイル ファストではない」イテレータはわざわざチェックする必要はなく、基礎となるデータ構造で問題なく処理を進めます。したがって、後でエラーが発生する可能性と引き換えに、ある程度の柔軟性 (この場合はおそらく疑わしい柔軟性) が得られます。つまり、存在しない値にアクセスしようとしています。

すべてのフェイルファスト戦略と同様に、エラーの検出が早ければ早いほど、エラーからの回復やデバッグが容易になるという考え方です。

于 2012-01-05T22:57:00.400 に答える
3

を呼び出すときiterator.next()に、イテレータが作成されてからnext()呼び出されるまでの間に何らかの変更が行われた場合は、すぐに ConcurrentModificationException がスローされます。これがフェイルファストの意味です。

Hashtable によって返される列挙には、この動作はありません。彼らは、あなたが何をしているのかを知っていると想定しており、その列挙の1つを使用してマップを反復しながらマップを変更すると、彼らの動作、AFAIKは未定義です。

于 2012-01-05T22:56:49.107 に答える