Warum wirft dieser Code keine ConcurrentModificationException
? Es ändert ein Collection
während es durchlaufen, ohne die Iterator.remove()
Methode zu verwenden, die the only safe way of removing sein soll.Warum wirft dieser Code keine ConcurrentModificationException?
List<String> strings = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String string : strings)
if ("B".equals(string))
strings.remove("B");
System.out.println(strings);
ich das gleiche Ergebnis, wenn ich die ArrayList
mit einem LinkedList
ersetzen. Wenn ich jedoch die Liste zu ("A", "B", "C", "D)
oder nur ("A", "B")
ändere, bekomme ich die Ausnahme wie erwartet. Was ist los? Ich verwende jdk1.8.0_25
, wenn das relevant ist.
EDIT
ich den folgenden Link gefunden habe
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4902078
Der entsprechende Abschnitt ist
Die naive Lösung Kommodifizierung Kontrollen hasNext in AbstractList hinzuzufügen ist, aber das verdoppelt die Kosten für die Überprüfung der Kompatibilität. Es stellt sich heraus, dass es ausreichend ist, den Test nur auf der letzten Iteration zu machen, die praktisch nichts zu den Kosten hinzufügt. Mit anderen Worten, die aktuelle Implementierung von hasNext:
public boolean hasNext() { return nextIndex() < size; }
durch diese Implementierung ersetzt:
public boolean hasNext() { if (cursor != size()) return true; checkForComodification(); return false; }
Diese Änderung vorgenommen wird, nicht weil eine Sun-interne Aufsichtsbehörde es abgelehnt. Das formelle Urteil hat gezeigt, dass die Änderung " das Potenzial für eine erhebliche Kompatibilität Auswirkungen auf bestehenden Code gezeigt hat". (Die „Auswirkungen auf der Kompatibilität“ sind, dass das Update das Potenzial mit einer ConcurrentModificationException zu ersetzen stilles Fehlverhalten hat.)
Weil 'ConcurrentModificationException' auf einem "Best-Effort" -Basis –
Mögliche doppelte geworfen 24980651/java-util-concurrentmodificationexception-nicht-geworfen-wann-erwartet) – Pshemo
Ich liebe, wie der Grund, warum Sun die Änderung nicht gemacht hat ist, dass es einige schlechten Code tatsächlich starten könnte werfen die Ausnahme, die es – Mshnik