Обычно формулируется в виде задачи на внимательность «что здесь не так», например
for (String item : arrayList)
if (item.length() > 2)
arrayList.remove(item);
Подвох в том, что итератор
ArrayList, который используется в таком варианте цикла
for, является
fail-fast, то есть не поддерживает итерацию с параллельной модификацией. А параллельная модификация случается даже в одном потоке, что демонстрирует этот пример. Следующий шаг итератора после удаления элемента выбросит
ConcurrentModificationException.
Не исключение, но неожиданный результат получится если пользоваться не итератором, а обычным циклом
for – при каждом удалении нумерация элементов будет сдвигаться.
Единственный способ удалить элемент из коллекции при обходе, не получив при этом
ConcurrentModificationException или неопределенное поведение – удалить с помощью
remove() того же инстанса итератора. Вариант
ListIterator поможет, если в теле цикла требуется и работа с индексами.
Некоторые коллекции, такие как
CopyOnWriteArrayList и
ConcurrentHashMap адаптированные под многопоточную среду и имеют fail-safe итераторы.