recorrer que listas lista iterador español enteros colecciones java collections concurrency

java - que - Cuando ordeno una Lista, ¿qué ocurre con sus iteradores?



que es un iterador en java (4)

En general, cualquier tipo de mutación en una colección invalidará sus iteradores. Una mutación hecha a través de un iterador no invalidará ese iterador. Existen algunas implementaciones de colecciones excepcionales, como CopyOnWriteArrayList .

La solución general sería ordenar una copia de la colección o recrear sus iteradores.

Digamos que tengo un objeto List y un iterador para esa lista.

Ahora ordeno la lista con java.util.Collections.sort()

  • ¿Qué pasa con el iterador?
  • ¿Su comportamiento todavía está definido y todavía se puede usar?
  • Si no, ¿puedo evitar destruir los iteradores de la lista?

Sé que este problema podría evitarse cambiando el diseño del programa, clonando la lista, por ejemplo, pero específicamente quiero saber el comportamiento "oficial" de Java.


Escribí un código para ver qué sucede cuando una colección se ordena mientras está iterando. Parece que el iterador no arroja ninguna excepción, pero continúa iterando normalmente. Aún le da resultados incorrectos si espera iterar sobre la colección sin clasificar. Mira eso :

public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("D"); list.add("B"); list.add("A"); list.add("C"); list.add("E"); Iterator<String> it = list.iterator(); String s = it.next(); System.out.println(s); s = it.next(); System.out.println(s); Collections.sort(list); Iterator<String> it2 = list.iterator(); s = it.next(); System.out.println(s); s = it.next(); System.out.println(s); s = it.next(); System.out.println(s); while (it2.hasNext()) { System.out.println(it2.next()); } }

Espero eso ayude.


La mayoría de las colecciones en java.util son "fail-fast" y pueden arrojar una ConcurrentModificationException si se cambia la colección subyacente. Cabe señalar que esto está destinado a la depuración y, por lo tanto, no está garantizado. De acuerdo con los javadocs, esto es cierto para todos los descendientes de AbstractList , pero esto no es cierto para CopyOnWriteArrayList , que está destinado para el uso de subprocesos múltiples.


Los iteradores generalmente no son válidos después de cualquier modificación en sus colecciones subyacentes, excepto a través del iterador mismo. (Por ejemplo, ListIterator permite la inserción y eliminación).

Sin duda, esperaría que cualquier iterador se invalidara después de una clasificación, y si no fuera así, no tendría ni idea de qué orden esperar.