Назад к вопросам
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 итераторы.