Изменяется ли iterator.next, если базовый список изменяется с помощью метода добавления LinkedList?

intLinkList = 2, 4, 6, 8, 10
Iterator itr = intLinkList.iterator()

Скажем, итератор выполняет итерацию и в данный момент указывает на целое число 6.

itr current item  = 6
itr previous item = 4
itr next item     = 8

Когда itr в данный момент указывает на Integer 6, я использую метод add(Object obj, int index) Linklists для добавления / вставки Integer 7 между Integer 6 и Integer 8.

Я понимаю, что этот экземпляр itr недействителен после этой модификации, потому что базовый список был изменен, следовательно, modCount!= Ожидаемый ModCount.

У меня такой вопрос: изменяет ли модификация с помощью метода add LinkedList элемент, на который указывает itr.next? Я немного читал, и я знаю, что это вызовет исключение ConcurrentModificationException. Но это не отвечает на мой вопрос, если элемент itr.next изменяется, если базовый список изменяется, когда итератор выполняет итерацию.

2 ответа

Решение

Изменяет ли модификация с помощью метода add LinkedList элемент, на который указывает itr.next?

Нет.

призвание LinkedList"s add ничего не меняет в Iteratorгосударство Как только вы позвоните, Iterator"s next() метода, и до того, как итератор вычислит следующий элемент для возврата, он проверит наличие изменений и выдаст ConcurrentModificationException,

Вот соответствующий код, из AbstractList$Itr:

    public E next() {
        checkForComodification(); // will throw ConcurrentModificationException
                                  // before the Iterator's state is changed
        try {
            int i = cursor;
            E next = get(i);
            lastRet = i;
            cursor = i + 1;
            return next;
        } catch (IndexOutOfBoundsException e) {
            checkForComodification();
            throw new NoSuchElementException();
        }
    }

Ключевая деталь в том, что в Java есть только примитивы и ссылки.

Когда вы добавляете что-то в Список или любую коллекцию, это копия ссылки.

Если вы изменяете объект, на который есть ссылка, коллекция не изменяется, хотя при печати содержимого это может выглядеть так.

Если вы вызываете add или remove для коллекции, для LinkedList и ArrayList итератор не изменяется, но больше не может выполнять итерацию (есть одно исключение)

Если вы используете CopyOnWriteArrayList, вы можете изменить коллекцию и продолжить итерацию, однако итератор не видит изменения.

Другие вопросы по тегам