devo inferiore a quella di due javaL'elenco genera ConcurrentModificationException ma set non lancia 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());
}
}
}
Quando eseguo sopra codice ottengo sotto uscita.
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)
Quale è previsto mentre sto modificando l'elenco durante l'iterazione. Ma in sotto la classe java la stessa logica viene eseguita dalla famiglia set.
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());
}
}
}
E in uscita è.
hibernate
core java
j2ee
php
struts
Non c'è ConcurrentModificationException qualsiasi.
Voglio solo sapere perché stesso pezzo di codice genera ConcurrentModificationException in caso di list
famiglia, ma non c'è alcuna ConcurrentModificationException in caso di set
famiglia
+1 per demo fiddle –
nit: l'ArrayList iterator controlla effettivamente un conteggio delle modifiche, non la lunghezza di per sé, quindi se si aggiunge un elemento immediatamente rimosso, lasciando la lunghezza uguale, si otterrà comunque una ConcurrentModificationException in seguito. –