Sobes.tech
Middle

Hoe gedraagt een geïnstantieerd iterator voor een collectie zich als de methode collection.remove() wordt aangeroepen?

sobes.tech AI

Antwoord van AI

Het aanroepen van collection.remove() tijdens iteratie met behulp van een geïnstantieerd iterator kan leiden tot een ConcurrentModificationException.

Dit gebeurt omdat de iterator meestal niet op de hoogte is van wijzigingen die rechtstreeks buiten de iterator in de onderliggende collectie worden aangebracht. De iterator houdt een interne staat bij (bijvoorbeeld de index van het huidige element), die ongeldig wordt als de collectie wordt gewijzigd buiten de methoden van de iterator (iterator.remove()).

Sommige implementaties van collecties kunnen "fail-fast" zijn en specifiek ConcurrentModificationException gooien bij het detecteren van dergelijke wijzigingen, om onvoorspelbaar gedrag te voorkomen.

De enige veilige manier om de collectie te wijzigen tijdens iteratie is door de methode iterator.remove() te gebruiken.

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)) {
                // Dit zal een `ConcurrentModificationException` veroorzaken
                 // list.remove(element);

                // Veilige manier om te verwijderen
                 iterator.remove();
            }
        }

        System.out.println(list);
    }
}