concurrentmodificationexception java iterator collections concurrentmodification

java - ¿Cómo interactúa con una Colección<T> y modifica sus elementos sin ConcurrentModificationException?



concurrentmodificationexception java (2)

Puedes simplemente usar iterator.remove() :

for(Iterator<?> index = myCollection.iterator(); index.hasNext();) { Object item = index.next(); index.remove(); }

Tenga en cuenta que esto puede causar tiempo de ejecución O(n^2) para algunos tipos de datos (por ejemplo, ArrayList ). En este caso particular, podría ser más eficiente simplemente borrar la colección después de la iteración.

Necesito hacer algo como esto ...

Collection<T> myCollection; ///assume it is initialized and filled for(Iterator<?> index = myCollection.iterator(); index.hasNext();) { Object item = index.next(); myCollection.remove(item); }

Obviamente esto arroja ConcurrentModificationException ...

Así que lo he intentado pero no me parece elegante / eficiente y arroja un Tipo de seguridad: descarte no comprobado de Objeto a T de advertencia

Object[] list = myCollection.toArray(); for(int index = list.length - 1; index >= 0; index--) { myCollection.remove((T)list[index]); }


Una advertencia lateral, el tipo de la colección original también importa en esta instancia. Por ejemplo, Arrays.asList(new Integer[]{1, 2, 3}); extrañamente crea una lista UnmodifiableList , en cuyo caso necesitaría crear una lista de ArrayList vacía realizar newList.addAll(Arrays.asList(new Integer[]{1, 2, 3});