Что выведет код Senior Коллекции изнутри обновлено

Что выведет: удаление в foreach без исключения

Вопрос

Что выведет программа (Java 21)? Каждый вывод println с новой строки.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> a = new ArrayList<>(List.of("x", "y", "z"));
        for (String s : a) {
            if (s.equals("y")) a.remove(s);
        }
        System.out.println(a);
        List<String> b = new ArrayList<>(List.of("x", "y", "z"));
        try {
            for (String s : b) {
                if (s.equals("x")) b.remove(s);
            }
        } catch (ConcurrentModificationException e) {
            System.out.println("CME");
        }
        System.out.println(b);
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: [x, z], CME, [y, z]. Удаление предпоследнего элемента не бросает CME: размер стал 2, курсор итератора тоже 2, hasNext() возвращает false, и цикл заканчивается до проверки modCount.

Что выведет

[x, z]
CME
[y, z]

Разбор

Удаление предпоследнего элемента не бросает CME: размер стал 2, курсор итератора тоже 2, hasNext() возвращает false, и цикл заканчивается до проверки modCount. Элемент z при этом просто не обойдён. Во втором списке после удаления x цикл продолжается, next() видит изменённый modCount и бросает CME, а удаление уже произошло.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме