¿Por qué este código lanza ConcurrentModificationException?
List<Integer> nums = new ArrayList<>(List.of(1, 2, 3, 4));
for (Integer n : nums) {
if (n % 2 == 0) nums.remove(n);
}Opciones
removeno está permitido en listas creadas connew ArrayList- La lista se modificó mientras el iterator del for-each la recorría (Opción correcta)
- Los objetos
Integerno se pueden quitar de una lista - Otro thread está cambiando la lista al mismo tiempo
Respuesta
Porque la lista se modificó estructuralmente mientras el iterator del for-each la recorría
Por qué
El bucle for-each usa un iterator por debajo. El iterator recuerda cuántas modificaciones tenía la lista al empezar. Si añades o quitas elementos a través de la propia lista durante el bucle, el iterator detecta el cambio y falla de inmediato con esta excepción. Ocurre incluso con un solo thread.
Opciones seguras: nums.removeIf(n -> n % 2 == 0), usar iterator.remove() o construir una lista nueva con un stream.
nums.removeIf(n -> n % 2 == 0);Recuerda
No modifiques una colección mientras la recorres; usa removeIf o Iterator.remove.