for (String item : arrayList)
if (item.length() > 2)
arrayList.remove(item);
The catch here is that the
ArrayList
iterator used in this type of for
loop is fail-fast, meaning it does not support concurrent modification during iteration. Concurrent modification can occur even within a single thread, as demonstrated in this example. The next iteration step after removing an element will throw a ConcurrentModificationException
.No exception, but unexpected results can occur if using a regular
for
loop – each removal will shift the indexing of elements.The only way to remove an element from a collection while iterating without receiving a
ConcurrentModificationException
or undefined behavior is to use the remove()
method of the same iterator instance. A ListIterator would be helpful if index manipulation is also required within the loop body.Some collections, such as
CopyOnWriteArrayList
and ConcurrentHashMap
, are adapted for multi-threaded environments and have fail-safe iterators.