Ответ
Результат зависит от способа удаления:
- Безопасный способ: Использование
Iterator.remove(). - Небезопасный способ: Вызов
Collection.remove()напрямую во время итерации (например, в цикле for-each) приводит кConcurrentModificationException.
Почему? Большинство коллекций (например, ArrayList) отслеживают количество изменений (modCount). Итератор проверяет, что это значение не изменилось с момента его создания. Прямое изменение коллекции нарушает это условие.
Пример безопасного удаления:
List<String> list = new ArrayList<>(List.of("a", "b", "c"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String elem = it.next();
if (elem.equals("b")) {
it.remove(); // Корректно! Итератор синхронизирует состояние.
}
}
// list = ["a", "c"]
Пример, вызывающий исключение:
for (String s : list) { // Неявно использует итератор
if (s.equals("b")) {
list.remove(s); // ConcurrentModificationException!
}
}
Особый случай: Для потокобезопасных коллекций, таких как ConcurrentHashMap, удаление во время итерации разрешено.