¡Atención! ArrayList adiciones y supresiones no ensucia con ...

A menudo es necesario utilizar el proceso de programación de la colección, y que arrayList se utiliza a menudo, pero en un reciente aumento de las deleciones y ha habido algunos problemas, compartiendo el siguiente registro.

Dos de los puntos de código después de la

List<String> arrayList1 = new ArrayList<String>();
arrayList1.add("1");
arrayList1.add("2");
for (String s : arrayList1) {
    if("1".equals(s)){
        arrayList1.remove(s);
    }}
    List<String> arrayList2 = new ArrayList<String>();
    arrayList2.add("2");arrayList2.add("1");
    for (String s : arrayList2) {
        if("1".equals(s)){
        arrayList2.remove(s);
    }
}

Los resultados del programa son los siguientes:

arrayList1 el método remove tiene éxito,
el método de eliminación de arrayList2 operación lanzar una excepción ConcurrentModificationException.

Consideramos que el código fuente para analizar la razón de la excepción
porque la esencia es utilizar el foreach iterador iterador, todas las clases de colección Collecation implementarán la interfaz Iterable.
Encuentra método iterador clase ArrayList ()

public Iterator<E> iterator() {
    return new Itr();
}

Esencia iterador es primero hasNext método call () determina el siguiente elemento de memoria no está presente, a continuación, utilizar el método siguiente () para eliminar un elemento

public boolean hasNext() {
    return cursor != size;
}

@SuppressWarnings("unchecked")
public E next() {
    checkForComodification();
    int i = cursor;
    if (i >= size)
        throw new NoSuchElementException();
    Object\[\] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)
        throw new ConcurrentModificationException();
    cursor = i + 1;
    return (E) elementData\[lastRet = i\];
}

El arraylist1 arriba ¿Por qué se puede eliminar con éxito? De hecho, es sólo un ciclo, de manera exitosa.

Debido a que el elemento 1 después de que se retire, se convierte en un tamaño-1, entonces la variable dentro de Itr cursor 0 a 1, 1 = 1 en este momento, al final del ciclo, de manera exitosa.

¿Por arraylist2 falta quitar? Debido a que es el segundo ciclo de tiempo, sino también eliminar un éxito, pero el tercer juez próxima vez cursor no es igual a un valor de 2 resultados en el tamaño actual 1, por lo que el siguiente método de ejecución, el más importante vino antes de quitar resultados de la operación de ArrayList en un valor de añadir 1 modCount entonces la clase Itr expectedModCount se mantiene sin cambios, se producirá una excepción.

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

Del mismo modo disponibles, debido a la operación de suma dará lugar a incremento modCount, no se puede eliminar en foreach, añadir, modificar los elementos en el ArrayList.

En este sentido, se recomienda utilizar un iterador Iterator quitan elementos.

Iterator<String> ite = arrayList2.iterator();
while(ite.hasNext()) {
    if("1".equals(ite.next())) {
        ite.remove();
    }
}

Si no hay operación simultánea, también tenemos que estar encerrado operaciones iterador.

Autor: luchando pequeños programadores
https://www.toutiao.com/i6754322606561690116/

Recomendé a mi blog para leer más:

1. Java JVM, colecciones, multithreading, nueva serie de tutoriales

2. el Spring MVC, el arranque de la primavera, las series de primavera de la nube tutoriales

3. Maven, Git, el Eclipse, IntelliJ IDEA herramienta serie de tutoriales

4. Java, la arquitectura de fondo, Alibaba y otros fabricantes se enfrentan a nuevas preguntas

La vida es hermosa, ver mañana ~

Supongo que te gusta

Origin www.cnblogs.com/javastack/p/12515934.html
Recomendado
Clasificación