В данном фрагменте возникнет ConcurrentModificationException при попытке получить второй элемент итератора. После первого удаления список станет [2, 3], но итератор об этом не уведомлён.
Поведение ArrayList при удалении элементов во время обхода foreach‑циклом
В данном фрагменте возникнет 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 не является механизмом синхронизации и не гарантирует обнаружение каждого неправильного изменения при любых сценариях.