util concurrentmodificationexception java collections concurrentmodification

concurrentmodificationexception - iterator java



¿Cómo modificar una colección mientras se realiza la iteración utilizando para cada bucle sin ConcurrentModificationException? (4)

Si solo desea eliminar el elemento de la colección, puede usar Iterator en lugar de Iterable.

De lo contrario, lo que puede hacer es no iterar la colección original, sino primero hacer una copia de la lista. Por ejemplo, si su colección es una lista, puede crear una nueva ArrayList (originaList) e iterar sobre ella. La modificación debe hacerse a la lista original.

Otra alternativa que quizás sea mejor para su caso de uso, es no usar para cada uno, sino el tradicional para.

Si modifico una Colección mientras itero sobre ella usando for-each loop, da ConcurrentModificationException . ¿Hay algún trabajo alrededor?


Una segunda solución es usar una clase de colección cuyos iteradores no den la excepción. Por ejemplo, ConcurrentLinkedQueue , ConcurrentHashMap y así sucesivamente.

Estos evitan la necesidad de lanzar excepciones al proporcionar modelos de consistencia más débiles para los iteradores. (Por supuesto, debe comprender esos modelos y decidir si son adecuados para su aplicación).

Por lo general, son un poco más lentas que las colecciones no concurrentes, pero más rápidas que las envolturas de colecciones sincronizadas si hay una contención significativa.


Una solución alternativa es guardar los cambios y agregarlos / eliminarlos después del ciclo.

Por ejemplo:

List<Item> toRemove = new LinkedList<Item>(); for(Item it:items){ if(remove){ toRemove.add(it); } } items.removeAll(toRemove);


Utilice Iterator#remove .

Esta es la única forma segura de modificar una colección durante la iteración. Para obtener más información, consulte el tutorial de la interfaz de colección .

Si también necesita la capacidad de agregar elementos mientras está iterando, use un ListIterator .