Назад к вопросам
Middle
70
questionbank
Что произойдет, если мы изменим коллекцию во время обхода с помощью итератора?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
При обходе коллекции с использованием стандартного (fail-fast) итератора, любое изменение коллекции (добавление, удаление элементов) с помощью методов самой коллекции, а не итератора, приведет к генерации ConcurrentModificationException.
Итератор хранит внутреннее состояние (счетчик модификаций), которое сравнивается с состоянием коллекции при каждой операции (next(), hasNext()). Если счетчики не совпадают, выбрасывается исключение.
Пример:
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
Iterator<String> it = names.iterator();
while (it.hasNext()) {
String name = it.next();
if (name.equals("Bob")) {
// Это вызовет ConcurrentModificationException
names.remove(name);
}
}
Чтобы безопасно изменять коллекцию во время обхода, следует использовать методы итератора (remove()) или использовать конкурирующие коллекции (ConcurrentHashMap, CopyOnWriteArrayList), которые предоставляют fail-safe итераторы.