Что произойдет при удалении элементов из коллекции во время итерации по ней в Java?

«Что произойдет при удалении элементов из коллекции во время итерации по ней в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Результат зависит от способа удаления:

  • Безопасный способ: Использование Iterator.remove().
  • Небезопасный способ: Вызов Collection.remove() напрямую во время итерации (например, в цикле for-each) приводит к ConcurrentModificationException.

Почему? Большинство коллекций (например, ArrayList) отслеживают количество изменений (modCount). Итератор проверяет, что это значение не изменилось с момента его создания. Прямое изменение коллекции нарушает это условие.

Пример безопасного удаления:

List<String> list = new ArrayList<>(List.of("a", "b", "c"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String elem = it.next();
    if (elem.equals("b")) {
        it.remove(); // Корректно! Итератор синхронизирует состояние.
    }
}
// list = ["a", "c"]

Пример, вызывающий исключение:

for (String s : list) { // Неявно использует итератор
    if (s.equals("b")) {
        list.remove(s); // ConcurrentModificationException!
    }
}

Особый случай: Для потокобезопасных коллекций, таких как ConcurrentHashMap, удаление во время итерации разрешено.