Назад к вопросам
Middle
83
questionbank

Как поведет себя инстанцированный итератор для коллекции, если вызвать метод collection.remove()?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Вызов collection.remove() во время итерации с помощью инстантицированного итератора может привести к возникновению ConcurrentModificationException.

Это происходит потому, что итератор обычно не знает об изменениях, внесенных в базовую коллекцию напрямую извне итератора. Итератор поддерживает внутреннее состояние (например, индекс текущего элемента), которое становится невалидным, если коллекция изменяется не через методы самого итератора (iterator.remove()).

Некоторые реализации коллекций могут быть "fail-fast" (быстро падающие) и специально бросать ConcurrentModificationException при обнаружении таких изменений, чтобы избежать непредсказуемого поведения.

Единственный безопасный способ модифицировать коллекцию во время итерации — это использовать метод iterator.remove().

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorModificationExample {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()) {
            String element = iterator.next();
            if ("B".equals(element)) {
                // Это вызовет ConcurrentModificationException
                 // list.remove(element);

                // Это безопасный способ удаления
                 iterator.remove();
            }
        }

        System.out.println(list);
    }
}