Sobes.tech
Middle

Kaip elgs instancijuotas iterators kolekcijai, jei iškviesime collection.remove() metodą?

sobes.tech AI

Atsakymas iš AI

Kviečiant collection.remove() iteracijos metu, naudojant įkurtą iteratorių, gali įvykti ConcurrentModificationException.

Tai vyksta todėl, kad iteratorius paprastai nežino apie pakeitimus, atliktus pagrindinėje kolekcijoje tiesiogiai išorėje. Iteratorius palaiko vidinę būseną (pavyzdžiui, dabartinio elemento indeksą), kuri tampa nebegalioja, jei kolekcija keičiasi už iteratoriaus metodų (iterator.remove()) ribų.

Kai kurios kolekcijų įgyvendinimai gali būti "fail-fast" ir specialiai mesti ConcurrentModificationException, kai aptinka tokius pakeitimus, siekiant išvengti nenuspėjamo elgesio.

Vienintelis saugus būdas keisti kolekciją iteracijos metu yra naudoti iterator.remove() metodą.

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)) {
                // Tai sukels `ConcurrentModificationException`
                 // list.remove(element);

                // Saugi ištrynimo būdas
                 iterator.remove();
            }
        }

        System.out.println(list);
    }
}