Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: iteration, collection, remove, ConcurrentModificationException, iterator

Как корректно удалять элементы из коллекции при итерации?

Вопрос проверяет понимание безопасного удаления элементов из коллекции во время итерации, чтобы избежать ошибок ConcurrentModificationException или неопределённого поведения.

Короткий ответ

При прямом удалении элемента из коллекции (например, ArrayList) во время итерации через цикл for-each или итератор возникает ConcurrentModificationException. Для безопасного удаления используйте метод remove() самого объекта Iterator, который удаляет текущий элемент и корректно обновляет состояние итератора. Альтернативно, можно собрать элементы для удаления в отдельный список и удалить их после цикла, либо использовать методы removeIf() (в Java 8+) или итерацию по индексу в обратном порядке для списков.

Длинный ответ

Удаление элементов из коллекции во время итерации — частая задача, например, при фильтрации данных. Прямое удаление через методы коллекции (например, list.remove(element)) внутри цикла for-each или при активном итераторе ломает внутреннее состояние итератора, что приводит к ConcurrentModificationException в Java или неопределённому поведению в других языках.

Безопасные подходы

Основные способы безопасного удаления:

  • Использование Iterator.remove(): Самый прямой и рекомендованный способ. Итератор предоставляет метод remove(), который удаляет текущий элемент (последний, возвращённый next()) и синхронизирует состояние коллекции и итератора.
  • Сбор элементов для удаления: Создайте временный список элементов, которые нужно удалить, и выполните удаление после завершения итерации.
  • Использование removeIf() (Java 8+): Удобный метод коллекций, принимающий предикат.
  • Итерация по индексу в обратном порядке: Для списков (например, ArrayList) можно итерироваться с конца, чтобы сдвиг индексов при удалении не влиял на последующие элементы.

Примеры кода

Пример с Iterator.remove() в Java:

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

Пример с removeIf():

list.removeIf(item -> item.equals("b"));

Пример обратной итерации по индексу для ArrayList:

for (int i = list.size() - 1; i >= 0; i--) {
    if (list.get(i).equals("b")) {
        list.remove(i); // Безопасно, так как индексы сдвигаются только у уже обработанных элементов
    }
}

Вывод: Используйте Iterator.remove() для безопасного удаления во время итерации по любой коллекции; для списков также подходит обратная итерация по индексу, а removeIf() — самый лаконичный вариант при наличии предиката.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • Java

    Java

Ключевые слова

#iteration

#collection

#remove

#ConcurrentModificationException

#iterator

Подпишись на Java Developer в телеграм