Вызов метода remove() на коллекции, когда итератор еще активен, может привести к выбросу исключения ConcurrentModificationException. Это происходит потому, что изменение коллекции во время итерации приводит к несогласованности между состоянием итератора и коллекции. Если метод remove() вызван на коллекции в то время, когда итератор уже активирован, это может привести к изменению коллекции, которую перебирает итератор, что в свою очередь приведет к появлению ошибки.
Если вы хотите удалить элемент из коллекции, в то время как она перебирается при помощи итератора, лучше использовать метод remove() из самого итератора. Такая операция будет корректно синхронизирована и не породит исключение.
Пример:
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String element = iterator.next();
if(element.equals("two")) {
iterator.remove(); // безопасное удаление элемента "two" }
}
System.out.println(list); // [one, three]
В этом примере мы создаем список, перебираем его элементы при помощи итератора и безопасно удаляем элемент "two" при помощи метода remove() из итератора. В результате, если мы выведем содержимое списка после итерации, то увидим список [one, three].
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov