Iterating through a Collection, avoiding ConcurrentModificationException when removing objects in a loop Iterating through a Collection, avoiding ConcurrentModificationException when removing objects in a loop java java

Iterating through a Collection, avoiding ConcurrentModificationException when removing objects in a loop


Iterator.remove() is safe, you can use it like this:

List<String> list = new ArrayList<>();// This is a clever way to create the iterator and call iterator.hasNext() like// you would do in a while-loop. It would be the same as doing://     Iterator<String> iterator = list.iterator();//     while (iterator.hasNext()) {for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {    String string = iterator.next();    if (string.isEmpty()) {        // Remove the current element from the iterator and the list.        iterator.remove();    }}

Note that Iterator.remove() is the only safe way to modify a collection during iteration; the behavior is unspecified if the underlying collection is modified in any other way while the iteration is in progress.

Source: docs.oracle > The Collection Interface


And similarly, if you have a ListIterator and want to add items, you can use ListIterator#add, for the same reason you can use Iterator#remove — it's designed to allow it.


In your case you tried to remove from a list, but the same restriction applies if trying to put into a Map while iterating its content.


This works:

Iterator<Integer> iter = l.iterator();while (iter.hasNext()) {    if (iter.next() == 5) {        iter.remove();    }}

I assumed that since a foreach loop is syntactic sugar for iterating, using an iterator wouldn't help... but it gives you this .remove() functionality.


With Java 8 you can use the new removeIf method. Applied to your example:

Collection<Integer> coll = new ArrayList<>();//populatecoll.removeIf(i -> i == 5);