用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?
没有
调用 LinkedList
的 add
不会改变 Iterator
的任何状态。一旦调用 Iterator
的 next()
方法,在迭代器计算下一个元素到 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,您可以修改集合并继续迭代,但迭代器看不到更改。
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?
没有
调用 LinkedList
的 add
不会改变 Iterator
的任何状态。一旦调用 Iterator
的 next()
方法,在迭代器计算下一个元素到 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,您可以修改集合并继续迭代,但迭代器看不到更改。