Поведение ArrayList при удалении элементов во время обхода foreach‑циклом

В данном фрагменте возникнет ConcurrentModificationException при попытке получить второй элемент итератора. После первого удаления список станет [2, 3], но итератор об этом не уведомлён.

Короткий ответ

Что ответить на собеседовании

В данном фрагменте возникнет ConcurrentModificationException при попытке получить второй элемент итератора. После первого удаления список станет [2, 3], но итератор об этом не уведомлён.

Подробный разбор

Ответ с пояснениями

Условие

Разберите, какое исключение возникнет, если пытаться удалять элементы из ArrayList в процессе его итерации с помощью расширенного цикла for.

public static void main(String[] args) {
    List<Integer> numbers = new ArrayList<>();
    numbers.add(1);
    numbers.add(2);
    numbers.add(3);

    for (Integer item : numbers) {
        numbers.remove(0);
    }
}

Ответ

В данном фрагменте возникнет ConcurrentModificationException при попытке получить второй элемент итератора. После первого удаления список станет [2, 3], но итератор об этом не уведомлён.

Расширенный for использует Iterator. numbers.remove(0) структурно меняет список напрямую, а следующая операция next обнаруживает несовпадение счётчиков модификаций. Для безопасного удаления всех элементов проще numbers.clear(); для выборочного — removeIf либо iterator.remove() после next. Fail-fast не является механизмом синхронизации и не гарантирует обнаружение каждого неправильного изменения при любых сценариях.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее