Что выведет код 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 ошибок.