remove name collection change java collections iterator concurrentmodification

java - name - Colección-Iterator.remove() versus Collection.remove()



mongodb change name of database (6)

Según Sun,

"Iterator.remove es la única forma segura de modificar una colección durante la iteración, el comportamiento no se especifica si la colección subyacente se modifica de cualquier otra manera mientras la iteración está en progreso".

Tengo dos preguntas :

  1. ¿Qué hace que esta operación "Iterator.remove ()" sea estable que las demás?
  2. ¿Por qué proporcionaron un método "Collection.remove ()" si no sería útil en la mayoría de los casos de uso?

¿Qué hace que esta operación "Iterator.remove ()" sea estable que las demás?

Significa que el iterador sabe que eliminó el elemento para que no produzca una ConcurrentModifcationException.

¿Por qué proporcionaron un método "Collection.remove ()" si no sería útil en la mayoría de los casos de uso?

Usualmente usaría Map.remove () o Collection.remove () ya que esto puede ser mucho más eficiente que iterar sobre cada objeto. Si está eliminando mientras itera a menudo, sospecho que debería usar colecciones diferentes.


  1. Es solo una elección de diseño. Hubiera sido posible especificar un comportamiento diferente (es decir, el iterador tiene que omitir los valores que fueron eliminados por Collection.remove ()), pero eso habría hecho que la implementación del marco de recopilación sea mucho más compleja. Entonces, la opción de dejarlo sin especificar.

  2. Es bastante útil. Si conoce el objeto que desea eliminar, ¿por qué iterar?


Antes que nada, Collection.remove() es muy útil. Es aplicable en muchos casos de uso, probablemente más que Iterator.remove() .

Sin embargo, este último resuelve un problema específico: le permite modificar la colección mientras se itera sobre ella .

El problema resuelto por Iterator.remove() se ilustra a continuación:

List<Integer> l = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4)); for (int el : l) { if (el < 3) { l.remove(el); } }

Este código no es válido porque se llama l.remove() durante la iteración sobre l .

La siguiente es la forma correcta de escribirlo:

Iterator<Integer> it = l.iterator(); while (it.hasNext()) { int el = it.next(); if (el < 3) { it.remove(); } }


Como la documentación que citó claramente establece:

Iterator.remove es la única forma segura de modificar una colección durante la iteración

(énfasis añadido)

Al usar am iterator, no puede modificar la colección, excepto llamando a Iterator.remove() .

Si no está iterando la colección, usaría Collection.remove() .


Si está iterando sobre una colección y usa:

Collection.remove()

puede obtener errores de tiempo de ejecución (específicamente ConcurrentModifcationException) porque está cambiando el estado del objeto utilizado previamente para construir la serie explícita de llamadas necesarias para completar el ciclo.

Si utiliza:

Iterator.remove()

le dice al tiempo de ejecución que le gustaría cambiar la colección subyacente Y volver a evaluar la serie explícita de llamadas necesarias para completar el ciclo.


Por lo que entiendo, Collection.remove (int index) también devolverá el objeto eliminado. Iterative.remove () no lo hará.