Sobes.tech
Назад к вопросам
Junior — Middle
66

Каким образом может возникнуть исключение ConcurrentModificationException во время итерации по коллекции?

Компании, где спрашивали
Prime

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

sobes.tech AI

Исключение ConcurrentModificationException в Java возникает, когда во время итерации по коллекции происходит её структурное изменение (например, добавление или удаление элементов), не через итератор.

Например, если использовать ArrayList и в цикле for-each удалить элемент напрямую из коллекции, а не через метод итератора remove(), то будет выброшено это исключение:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String s : list) {
    if (s.equals("b")) {
        list.remove(s); // вызовет ConcurrentModificationException
    }
}

Это происходит потому, что итератор отслеживает изменения коллекции через внутренний счётчик модификаций (modCount). Если коллекция изменяется напрямую, счётчик не синхронизируется с итератором, и при следующем вызове next() или hasNext() выбрасывается исключение.

Чтобы избежать этого, нужно использовать методы итератора для удаления элементов:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    if (s.equals("b")) {
        iterator.remove(); // безопасное удаление
    }
}