Sobes.tech
Middle

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);
    }
}