Wenn ich über einen Standard HashMap
iteriere und versuche, Elemente hinzuzufügen, während ich iteriere, bekomme ich ConcurrentModificationException
.Hinzufügen von Elementen zu einer HashMap gleichzeitig
Also versuche ich, eine HashMap ermöglicht gleichzeitige ergänzt:
ConcurrentHashMap<String, Integer> cMap = new ConcurrentHashMap<>();
cMap.put("one", 1);
cMap.forEach((key, value) -> cMap.put(key + key, value + value));
System.out.println(cMap);
jedoch die resultierende Karte ein bisschen komisch ist:
{oneoneoneoneoneoneoneone=8, one=1, oneone=2, oneoneoneone=4}
und wenn der Schlüssel zx (cMap.put("zx", 1)
) zu ändern, um das Ergebnis jetzt ist:
{zxzx=2, zx=1}
Fragen:
1) Warum passiert das? Die beiden konkurrierenden Operationen (Iterieren und Hinzufügen) sollten nicht in Konflikt stehen.
2) Wie behebe ich die Inkonsistenz?
Wie entgegengesetzt zu Sammlungen, wenn eine Saite zu ändern, während sie über die Zeichen dieser Zeichenkette Iterieren, wird dieses Problem nicht eingehalten werden:
String str = scanner.next();
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) == str.charAt(i-1)) {
str = str.substring(0, i-1) + str.substring(i+1);
i = 0;
}
}
if (str.length() == 0) {
System.out.println("Empty String");
} else {
System.out.println (str);
}
}
zu beachten, dass in der obigen Schleife, ist die Quelle nicht String tatsächlich geändert, aber neu zugewiesen, da String unveränderlich ist und nicht geändert werden kann.
Der obige Code funktioniert gut und konsistent. Ist dies ein Beispiel dafür, warum Strings fadensicher sind?
Ich * wusste *, ich habe das Beispiel [irgendwo] gesehen (https://Stackoverflow.com/a/44307009/2711488) ... – Holger
@Holger Sie wurden auf einer dieser Kommentare zitiert, die Sie dort gemacht (das verursacht ein 'OOM') auf einer lokalen Java-Gruppe, die wir hier manchmal tun :) genial, das wieder zu lesen – Eugene