Retire la iteración mientras deja el elemento y no lanza concurrente E

CrazySabbath:

Me encontré con este pedazo de un código, que elimina el elemento de la lista, mientras que la iteración, y sin embargo, no lanza una excepción concurrente y hojas de algunos elementos de la lista.

¿Porqué es eso?

Ejemplo:.

public class Application {
    public static void main(String[] args) {
        List<Integer> integerList = new ArrayList<Integer>();
        integerList.add(1);
        integerList.add(2);

        for (Integer integer : integerList) {
            removeInteger(integerList, integer);
        }

        System.out.println(integerList.toString()); // prints [2] as it was not removed (while it should be)
    }

    private static void removeInteger(List<Integer> integerList, Integer integer) {
        for (Integer integer1 : integerList) {
            if (integer.equals(integer1)) {
                int index = integerList.indexOf(integer);
                if (index >= 0) {
                    integerList.remove(index);
                }
            }
        }
    }
}

Si el cambio que removeIntegerel método a utilizar Iteratoren su lugar y en el mainpaso por una copia de integerListtodo funciona como se esperaba.

segundo :

En primer lugar si se agrega más elementos a la lista todavía fallará con una ConcurrentModificationException.

Por la razón que no falla con el ejemplo publicado, tenemos que echar un vistazo a lo que sucede internamente.

Si se depura se ve que en el ejemplo publicado, ambos bucles sólo son iterados vez. Extracción del elemento en el bucle interior ( removeIntegermétodo) agota ambos iteradores. Como no hay ninguna interacción adicional, es causado ningún error. 'Sólo' una llamada de Iterator#nextdespués de una modificación podría causar una ConcurrentModificationException.

Sí, pero ¿por qué se agota ellos?

Comprobación del código fuente de la ArrayList#Itrque podemos ver que

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

sólo comprueba una variable llamada size. Esta variable sizees una propiedad de la ArrayList. Cuando removese llama disminuye esta variable. Por lo tanto, la próxima vez que hasNextse llama, el iterador asume que no hay más elementos nuevos.

Nota al margen: cursorpuntos al siguiente elemento de la lista.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=230589&siteId=1
Recomendado
Clasificación