Esta publicación muestra un programa para resolver el problema de java.util.ConcurrentModificationException
por ArrayList
.
El mensaje de error tiene el siguiente aspecto:
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) ... ...
El problema
Es posible que desee iterar a través de un ArrayList
y eliminar algún elemento en determinadas condiciones. Por ejemplo, el siguiente código parece razonable:
List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); for (String s : list) { if (s.equals("B")) { list.remove(s); } } |
Ejecutar el código en realidad resultará en la siguiente excepción:
Solucion 1
Iterator
se puede utilizar para resolver este problema. Iterators
permitir que el llamador elimine elementos de la colección subyacente durante la iteración.
Iterator<String> iter = list.iterator(); while(iter.hasNext()){ String str = iter.next(); if( str.equals("B")){ iter.remove(); } } |
Solucion 2
En vez de ArrayList
, CopyOnWriteArrayList
se puede utilizar para resolver el problema. CopyOnWriteArrayList
es una variante segura para subprocesos de ArrayList
en el que todas las operaciones mutativas (agregar, establecer, etc.) se implementan haciendo una copia nueva de la matriz subyacente.
List<String> list = new CopyOnWriteArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); for (String s : list) { if (s.equals("B")) { list.remove(s); } } |
Esto es lo mismo para otras estructuras de datos, como HashSet, LinkedList, etc.