Sobes.tech
Middle
275

Kuidas käitub kogumiku instantsiiter, kui kutsume välja meetodi collection.remove()?

Vastus AI-lt

sobes.tech AI

Kutsudes collection.remove() iteratsiooni ajal, kasutades initsialiseeritud iteratorit, võib põhjustada ConcurrentModificationException-i.

See juhtub, kuna iterator tavaliselt ei tea, milliseid muudatusi tehakse põhikogumikus otse väljaspool iteratorit. Iterator säilitab sisemise oleku (näiteks, praeguse elemendi indeksi), mis muutub kehtetuks, kui kogumik muudetakse väljaspool iteratori meetodeid (iterator.remove()).

Mõned kogumite rakendused võivad olla "fail-fast" ja spetsiaalselt visata ConcurrentModificationException selliste muudatuste avastamisel, et vältida ettearvamatut käitumist.

Ainsaks ohutuks viisiks kogumi muutmiseks iteratsiooni ajal on kasutada iterator.remove() meetodit.

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)) {
                // See põhjustab `ConcurrentModificationException`
                 // list.remove(element);

                // Ohutu eemaldamise viis
                 iterator.remove();
            }
        }

        System.out.println(list);
    }
}