Sobes.tech
Junior — Middle

Nima uchun ArrayList ni iteratsiya qilish vaqtida bir vaqtning o'zida o'zgartirish amalga oshirilganda ConcurrentModificationException xatosi yuzaga keladi?

sobes.tech AI

AIdan javob

Исключение ConcurrentModificationException возникает, когда во время итерации по ArrayList происходит его структурное изменение (например, добавление или удаление элементов) не через итератор. Итератор ArrayList содержит внутренний счетчик модификаций (modCount), который увеличивается при изменениях списка. При вызове методов итератора (например, next()) происходит проверка, совпадает ли текущий modCount с сохранённым при создании итератора. Если они не совпадают, значит коллекция была изменена вне итератора, и выбрасывается ConcurrentModificationException, чтобы предупредить о потенциально некорректной работе с коллекцией.

Пример:

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

Правильный способ удаления во время итерации — использовать методы самого итератора:

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