Sobes.tech
Middle
276

Как ще се държи инстанцираният итератор за колекция, ако извикаме метода collection.remove()?

Отговор от AI

sobes.tech AI

Повикът collection.remove() по време на итерация с помощта на инстанциран итератор може да доведе до ConcurrentModificationException.

Това се случва, защото итераторът обикновено не знае за промените, направени в основната колекция директно отвън. Итераторът поддържа вътрешно състояние (например, индекс на текущия елемент), което става невалидно, ако колекцията се променя извън методите на итератора (iterator.remove()).

Някои реализации на колекции могат да бъдат "fail-fast" и специално да хвърлят ConcurrentModificationException, когато открият такива промени, за да избегнат непредсказуемо поведение.

Единственият безопасен начин за модифициране на колекцията по време на итерация е използването на метода 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)) {
                // Това ще предизвика `ConcurrentModificationException`
                 // list.remove(element);

                // Безопасен начин за премахване
                 iterator.remove();
            }
        }

        System.out.println(list);
    }
}