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.