Mam dwie klasy niżej javaLista wyrzuca ConcurrentModificationException, ale zestaw nie generuje ConcurrentModificationException?
import java.util.*;
public class ArrayListTest032 {
public static void main(String[] ar) {
List<String> list = new ArrayList<String>();
list.add("core java");
list.add("php");
list.add("j2ee");
list.add("struts");
list.add("hibernate");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
list.remove("php");
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
Kiedy uruchomić powyższy kod otrzymuję poniżej wyjścia.
core java
php
j2ee
struts
hibernate
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at ArrayListTest032.main(ArrayListTest032.java:20)
Co jest oczekiwane, ponieważ modyfikuję listę podczas iteracji. Ale w poniższej klasie java ta sama logika jest wykonywana przez ustawioną rodzinę.
import java.util.*;
public class HashSetTest021 {
public static void main(String[] ar) {
Set<String> set = new HashSet<String>();
set.add("core java");
set.add("php");
set.add("j2ee");
set.add("struts");
set.add("hibernate");
Iterator<String> itr = set.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
set.remove("php");
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
I na zewnątrz jest.
hibernate
core java
j2ee
php
struts
Nie ma żadnego ConcurrentModificationException.
Chcę tylko wiedzieć, dlaczego sam kawałek kodu rzuca ConcurrentModificationException w przypadku list
rodziny, ale nie ma żadnego ConcurrentModificationException w przypadku set
rodziny
+1 dla demo fiddle –
nit: Iterator ArrayList faktycznie sprawdza liczbę modyfikacji, a nie długość jako taką, więc jeśli dodasz, natychmiast usuniesz element, pozostawiając taką samą długość, po tym otrzymasz ConurrentModificationException. –