Sobes.tech
Middle

Kako će se ponašati instancirani iterator za kolekciju ako pozovemo metodu collection.remove()?

sobes.tech АИ

Одговор од АИ

Poziv collection.remove() tokom iteracije pomoću instanciranog iteratora može dovesti do ConcurrentModificationException.

To se dešava zato što iterator obično ne zna o promenama koje su napravljene u osnovnoj kolekciji direktno izvan iteratora. Iterator održava interno stanje (na primer, indeks trenutnog elementa), koje postaje nevažeće ako se kolekcija menja van metoda samog iteratora (iterator.remove()).

Neke implementacije kolekcija mogu biti "fail-fast" i posebno baciti ConcurrentModificationException pri otkrivanju takvih promena, kako bi se izbeglo nepredvidivo ponašanje.

Jedini siguran način za modifikaciju kolekcije tokom iteracije je korišćenje metode iterator.remove().

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)) {
                // Ovo će izazvati `ConcurrentModificationException`
                 // list.remove(element);

                // Siguran način za brisanje
                 iterator.remove();
            }
        }

        System.out.println(list);
    }
}