Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: concurrent modification, iterator, fail-fast, ConcurrentModificationException, collection iteration

Какие проблемы возникают при изменении коллекции во время обхода?

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

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

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

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

Проблемы при изменении коллекции во время обхода

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

Пример на Java

В Java при попытке изменить коллекцию во время итерации с помощью итератора выбрасывается ConcurrentModificationException. Например:

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String item : list) {
    if (item.equals("B")) {
        list.remove(item); // ConcurrentModificationException
    }
}

Это происходит из-за fail-fast поведения стандартных коллекций, которые проверяют количество модификаций.

Решения

  • Использование итератора с его методами: iterator.remove() безопасно удаляет текущий элемент.
  • Копирование коллекции: Создание копии для итерации, например, new ArrayList<>(list).
  • Специализированные коллекции: CopyOnWriteArrayList или ConcurrentHashMap для многопоточных сценариев.
  • Синхронизация: Блокировка коллекции при модификации и итерации.

Пример безопасного удаления

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

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

Вывод: Изменение коллекции во время обхода — частая ошибка, ведущая к исключениям или некорректным данным. Используйте итераторы с методами модификации, копирование или потокобезопасные коллекции для надёжного кода.

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

  • Testing

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

#concurrent modification

#iterator

#fail-fast

#ConcurrentModificationException

#collection iteration

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