用LinkedList add方法修改底层列表是否修改iterator.next?

Is iterator.next modified if the underlying list is modified with LinkedList add method?

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 时,我使用链接列表的 add(Object obj, int index) 方法 add/insert 整数 6 和整数 8 之间的整数 7。

我了解此 itr 实例在此修改后无效,因为基础列表已被修改,因此 modCount != expectedModCount。

我的问题是: 使用 LinkedList 的 add 方法进行的修改是否会更改 itr.next 指向的项目? 我做了一些阅读,我知道这会抛出一个 ConcurrentModificationException。 但这并不能回答我的问题,如果 itr.next 项在迭代器迭代时修改了基础列表是否被修改了。

Does the modification using LinkedList's add method change the item the itr.next is pointing at?

没有

调用 LinkedListadd 不会改变 Iterator 的任何状态。一旦调用 Iteratornext() 方法,在迭代器计算下一个元素到 return 之前,它将检查修改并抛出 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,您可以修改集合并继续迭代,但迭代器看不到更改。