Назад к вопросам
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(); // безопасное удаление
}
}