Primero mira un fragmento de código:
@Test
public void test02(){
List<String> list = new ArrayList<>(8);
list.add("tom");
list.add("jack");
list.add("marry");
list.add("wuwl");
for(String string:list){
if("wuwl".equals(string)){
list.remove(string);
}
}
}
El código anterior definitivamente generará java.util.ConcurrentModificationException
una excepción cuando se esté ejecutando y será list.remove(string);
reemplazado por la list.add("gg")
misma excepción.
Ingrese la ArrayList
línea 909 del código fuente:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
El uso ArrayList
del remove
método, modCount
será un plus, pero expectedModCount
al comienzo del ciclo, los dos son iguales, por checkForComodification
el método de determinación arroja ConcurrentModificationException
una excepción.
Cuando se usa el método ArrayList
de la clase interna para eliminar el elemento, los dos atributos anteriores se reasignarán para que sean iguales para garantizar el funcionamiento normal de la colección. Cambie la demostración anterior al siguiente código para que se ejecute normalmente:Itr
remove
@Test
public void test03(){
List<String> list = new ArrayList<>(8);
list.add("tom");
list.add("jack");
list.add("marry");
list.add("wuwl");
ListIterator<String> iterator = list.listIterator();
while(iterator.hasNext()){
if("wuwl".equals(iterator.next())){
iterator.remove();
iterator.add("gg");
}
}
System.out.println(list);
}
ListIterator<String> iterator = list.listIterator();
Si se reemplaza Iterator<String> iterator = list.iterator();
, hay otro remove
método, pero ningún add
método. El método de la lista dos List
se define para la interfaz, en ArrayList
el, iterator()
return directamente Itr()
y listIterator()
devuelve un ListItr
tipo de clase interna , la clase hereda Itr
e implementa ListIterator
la interfaz.