Вопрос проверяет понимание проблем, связанных с изменением коллекции во время её итерации, что важно для избежания ошибок в многопоточных и однопоточных сценариях.
Изменение коллекции (добавление, удаление или изменение элементов) во время её итерации может привести к непредсказуемому поведению, исключениям или некорректным результатам. Это связано с тем, что итератор, используемый для обхода, хранит внутреннее состояние, которое может стать несинхронизированным с самой коллекцией.
В 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
Testing
Ключевые слова
Подпишись на Java Developer в телеграм