Sobes.tech
Junior — Middle

Kas on olnud olukordi, kus kollektsiooni muutmisel selle läbimise ajal tekkis ConcurrentModificationException viga?

sobes.tech AI

Vastus AI-lt

Да, ошибка ConcurrentModificationException часто возникает, если во время обхода коллекции (например, ArrayList или HashSet) происходит её изменение (добавление или удаление элементов) не через итератор. Это связано с тем, что итераторы в Java проверяют, не изменялась ли коллекция с момента их создания, и при обнаружении изменений выбрасывают это исключение.

Чтобы избежать ошибки, можно:

  • Использовать итератор и его методы remove() для удаления элементов во время обхода.
  • Использовать коллекции из пакета java.util.concurrent, например CopyOnWriteArrayList, которые поддерживают безопасный обход при изменениях.
  • Собрать изменения и применить их после завершения обхода.

Пример безопасного удаления элементов из списка во время обхода:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    if (item.equals("b")) {
        iterator.remove(); // безопасное удаление
    }
}