如果使用LinkedList add方法修改了基础列表,是否会修改iterator.next?

时间:2018-10-10 09:07:44

标签: java linked-list iterator listiterator

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

假设迭代器正在迭代,并且当前指向Integer 6。

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

当itr当前指向Integer 6时,我使用Linklists的add(Object obj,int index)方法在Integer 6和Integer 8之间添加/插入Integer7。

我知道此Itr实例在此修改后无效,因为基础列表已被修改,因此modCount!= ExpectedModCount。

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

2 个答案:

答案 0 :(得分:1)

  

使用LinkedList的add方法进行的修改是否会更改itr.next指向的项目?

否。

LinkedList的状态下,调用add的{​​{1}}不会改变任何内容。调用后,Iterator的{​​{1}}方法在迭代器计算要返回的下一个元素之前,它将检查修改并抛出Iterator

以下是相关代码,摘自next()

ConcurrentModificationException

答案 1 :(得分:0)

一个关键的细节是Java只有原语和引用。

将内容添加到列表或任何集合时,它是引用的副本。

如果您修改引用的对象,则即使您打印内容,集合也不会被修改。

如果您对集合调用add或remove,对于LinkedList和ArrayList,迭代器不会被修改,但不能再迭代(有一个例外)

如果使用CopyOnWriteArrayList,则可以修改集合并保持迭代,但是迭代器看不到更改。