Изменяется ли iterator.next, если базовый список изменяется с помощью метода добавления LinkedList? - PullRequest
0 голосов
/ 10 октября 2018
intLinkList = 2, 4, 6, 8, 10
Iterator itr = intLinkList.iterator()

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

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

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

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

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

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

0 голосов
/ 10 октября 2018

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

Нет.

Вызов LinkedList add ничего не меняет в состоянии Iterator.После вызова метода Iterator 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();
        }
    }
...