2016-10-07 8 views
1

Betrachten Sie den folgenden Code.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)); 

Es wird ConcurrentModificationException auftreten. In dieser Situation habe ich verstanden, dass wir die Sammlungen, die wir wiederholen, nicht ändern können.
Bitte beachten Sie jedoch den folgenden Code. Ich entferne nur eine Linie, die map.put(4,"e"); ist
Es wird funktionieren!

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)); 


Irgendwelche Tipps? Warum passiert das?

+3

'" b "' wird das letzte Element. Ich nehme an, dass die Überprüfung in der "nächsten" Methode des Iterators durchgeführt wird und nicht mehr aufgerufen wird. – talex

+0

Es ist kein vollständiges Duplikat. Aber die allgemeine Idee hinter den Antworten ist dieselbe. – talex

Antwort

1

"b" wird zum letzten Element.

Die Überprüfung wird in next Methode des Iterators durchgeführt und es wird nicht mehr aufgerufen.

+0

Ich sehe, die Hash-Map wird die erwartete Mod-Anzahl mit der aktuellen Mod-Anzahl überprüfen, und unabhängig davon, welche Operationen wir mit dem letzten Element der Hash-Map gemacht haben, wird die Check-Operation nicht ausgelöst. Da die Überprüfung vor dem nächsten Element durchgeführt wird, haben wir aber das letzte Element erreicht. Deshalb wird es durchgehen. Danke vielmals!!! –

Verwandte Themen