Вопрос проверяет понимание безопасного удаления элементов из коллекции во время итерации, чтобы избежать ошибок ConcurrentModificationException или неопределённого поведения.
Удаление элементов из коллекции во время итерации — частая задача, например, при фильтрации данных. Прямое удаление через методы коллекции (например, list.remove(element)) внутри цикла for-each или при активном итераторе ломает внутреннее состояние итератора, что приводит к ConcurrentModificationException в Java или неопределённому поведению в других языках.
Основные способы безопасного удаления:
remove(), который удаляет текущий элемент (последний, возвращённый next()) и синхронизирует состояние коллекции и итератора.Пример с 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() — самый лаконичный вариант при наличии предиката.