Мы все знаем, что самый безопасный "и, возможно, только безопасный" способ удаления объекта из коллекции при его итерации - сначала получить Iterator
, выполнить цикл и удалить при необходимости;
Iterator iter=Collection.iterator();
while(iter.hasNext()){
Object o=iter.next()
if(o.equals(what i'm looking for)){
iter.remove();
}
}
То, что я хотел бы понять и, к сожалению, не нашел глубокого технического объяснения, заключается в том, как это удаление выполняется,
Если:
for(Object o:myCollection().getObjects()){
if(o.equals(what i'm looking for)){
myCollection.remove(o);
}
}
Будут бросать ConcurrentModificationException
, что делает "в технических терминах" Iterator.remove()
делать? Удаляет ли объект, прерывает цикл и перезапускает цикл?
Я вижу в официальной документации:
"Удаляет текущий элемент. Броски
IllegalStateException
, если делается попытка вызватьremove()
, которому не предшествует вызов next()."
Часть "удаляет текущий элемент", заставляет меня думать о той же самой ситуации, что происходит в "регулярном" цикле = > (выполнить тест равенства и удалить, если необходимо), но почему цикл Iterator ConcurrentModification-safe?