Sappiamo tutti che il modo più sicuro e "sicuro solo" di rimuovere un oggetto da una raccolta mentre lo itera è recuperare innanzitutto lo Iterator
, eseguire un ciclo e rimuoverlo quando necessario;Come il metodo di rimozione di Iterator rimuove effettivamente un oggetto
Iterator iter=Collection.iterator();
while(iter.hasNext()){
Object o=iter.next()
if(o.equals(what i'm looking for)){
iter.remove();
}
}
Quello che vorrei capire, e purtroppo non hanno trovato una spiegazione tecnica profonda circa, è come eseguire questa rimozione,
Se:
for(Object o:myCollection().getObjects()){
if(o.equals(what i'm looking for)){
myCollection.remove(o);
}
}
lancerà una ConcurrentModificationException
, cosa fa "in termini tecnici" Iterator.remove()
fare? Rimuove l'oggetto, interrompe il ciclo e riavvia il ciclo?
vedo nella documentazione ufficiale:
"rimuove l'elemento corrente Genera
IllegalStateException
se un tentativo è fatto per chiamareremove()
che non è preceduta da una chiamata a successivo().."
La parte "rimuove l'elemento corrente", mi fa pensare la stessa identica situazione accadendo in un ciclo "regolare" => (eseguire test di uguaglianza e rimuovere, se necessario), ma perché è il ciclo Iterator ConcurrentModification- sicuro?
si può vedere di persona: https://gist.github.com/kibotu/e480bd7505615a7311a6 –