次のコードを考慮してください。ConcurrentModificationException - HashMap
Map<Integer,String> map = new HashMap<Integer, String> (5);
map.put(1, "a");
map.put(2, null);
map.put(3, "b");
map.put(4, "e");
for (String str : map.values()) {
if ("b".equals(str)) {
map.put(5, "f");
}
}
System.out.println(map.get(5));
これは、ConcurrentModificationExceptionが発生することになります。このような状況では、私たちが反復しているコレクションを変更できないことを理解しました。
ただし、次のコードを検討してください。私はただ一つの行を削除しますmap.put(4,"e");
それは動作します!
Map<Integer,String> map = new HashMap<Integer, String> (5);
map.put(1, "a");
map.put(2, null);
map.put(3, "b");
for (String str : map.values()) {
if ("b".equals(str)) {
map.put(5, "f");
}
}
System.out.println(map.get(5));
任意のヒント?なぜこれが起こっているのですか?
'' b "'が最後の要素になります。チェックはイテレータの 'next'メソッドで実行され、もう呼ばれません。 – talex
完全な複製ではありません。しかし、答えの背後にある一般的な考え方は同じです。 – talex