2016-10-07 3 views
1

次のコードを考慮してください。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)); 


任意のヒント?なぜこれが起こっているのですか?

+3

'' b "'が最後の要素になります。チェックはイテレータの 'next'メソッドで実行され、もう呼ばれません。 – talex

+0

完全な複製ではありません。しかし、答えの背後にある一般的な考え方は同じです。 – talex

答えて

1

"b"が最後の要素になります。

イテレータの方法でnextの方法でチェックを行い、もはや呼び出されません。

+0

私は、ハッシュマップが現在のmodカウントで予想されるmodカウントをチェックし、ハッシュマップの最後の要素に対してどのような操作を行ったとしても、チェック操作はトリガーではありません。チェック操作は次の要素の前に実行されますが、最後の要素に達しました。そういうわけで、それは通り抜けます。どうもありがとう!!! –

関連する問題