Error al agregar o eliminar una colección en el cuerpo del bucle: java.util.ConcurrentModificationException

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.ConcurrentModificationExceptionuna excepción cuando se esté ejecutando y será list.remove(string);reemplazado por la list.add("gg")misma excepción.
Inserte la descripción de la imagen aquíIngrese la ArrayListlínea 909 del código fuente:

final void checkForComodification() {
    
    
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

El uso ArrayListdel removemétodo, modCountserá un plus, pero expectedModCountal comienzo del ciclo, los dos son iguales, por checkForComodificationel método de determinación arroja ConcurrentModificationExceptionuna excepción.
Inserte la descripción de la imagen aquíCuando se usa el método ArrayListde 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:Itrremove
Inserte la descripción de la imagen aquí

@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 removemétodo, pero ningún addmétodo. El método de la lista dos Listse define para la interfaz, en ArrayListel, iterator()return directamente Itr()y listIterator()devuelve un ListItrtipo de clase interna , la clase hereda Itre implementa ListIteratorla interfaz.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_41885819/article/details/107191848
Recomendado
Clasificación