Hogyan viselkedik egy példányosított iterátor egy gyűjtemény esetén, ha meghívjuk a collection.remove() metódust?
sobes.tech MI
Válasz az MI-től
Az collection.remove() hívása iteráció közben, egy példányosított iterator segítségével, ConcurrentModificationException-t okozhat.
Ez azért történik, mert az iterator általában nem tud a mögöttes kollekcióban közvetlenül végrehajtott változásokról. Az iterator belső állapotot tart fenn (például a jelenlegi elem indexét), amely érvénytelen lesz, ha a kollekciót az iterator metódusain kívül módosítják (iterator.remove()).
Néhány kollekció-implementáció "fail-fast" lehet, és kifejezetten ConcurrentModificationException-t dob, amikor ilyen változásokat észlel, hogy elkerülje a kiszámíthatatlan viselkedést.
Az egyetlen biztonságos módja a kollekció módosításának iteráció közben az, hogy az iterator.remove() metódust használjuk.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorModificationExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if ("B".equals(element)) {
// Ez `ConcurrentModificationException`-t fog okozni
// list.remove(element);
// Biztonságos törlési mód
iterator.remove();
}
}
System.out.println(list);
}
}