5

動作がjava.util.HashMap何であるかを学ぶために遊んでみました。fail-fast

HashMap map = new HashMap();
map.put("jon", 10);
map.put("sean", 11);
map.put("jim", 12);
map.put("stark", 13);
map.put("vic", 14);
Set keys = map.keySet();
for(Object k:keys) {
    System.out.println(map.get(k));
}

for(Object k:keys) {
   String key =(String)k;
   if(key.equals("stark")) {
      map.remove(key);
    }
}

System.out.println("after modifn");
for(Object k:keys) {
    System.out.println(map.get(k));
}

結果が出ました

12
11
10
14
13
after modifn
12
11
10
14

私もイテレータを使ってみました

Iterator<String> itr = keys.iterator();
while(itr.hasNext()) {
    String key = itr.next();
    if(key.equals("stark")) {
        map.remove(key);
    }
}

どちらの場合も取得できませんでしConcurrentModificationExceptionた..これは(javadocから)

一般的に言えば、同期されていない同時変更が存在する場合にハードな保証を行うことは不可能であるため、反復子のフェイルファスト動作は保証できません。フェイルファスト イテレーターは、ベスト エフォート ベースで ConcurrentModificationException をスローします。

私は言う別のスレッドをチェックしました、それはスローConcurrentModificationExceptionします..どう思いますか?

4

1 に答える 1

6

あなたが示した出力を考えると:

12
11
10
14
13   // notice this?
after modifn
12
11
10
14

13 は最後のキーと値のペアであるため、 をIterate通過HashMapし、最後に に対応するキーと値を削除すると、 が変更された直後にstark 13が停止するため、それ以上は行われません。いいえIterationHashMapiterateConcurrentModificationException.

于 2012-06-19T04:16:42.017 に答える