我只是对我正在做的一个程序有一个普遍的问题。
我有一个链表,其中一个实例变量是一个版本int,以确保没有并发修改例外。
如果我在链表中添加一个元素,那么我会更改版本。
我还使用了一个自定义迭代器,它遍历链表,该链表也有自己的版本。创建linkedList迭代器时,它将迭代器的版本设置为等于linkedList的版本。
我的问题是: 如果我用Iterator删除一个元素,我也应该更改迭代器版本吗?
基本上Iterator类中的每个方法都首先检查以确保版本是相同的,如果不是,它会抛出一个新的并发修改异常。
迭代器是否更改列表是否重要?
答案 0 :(得分:0)
我的问题是:如果我用Iterator删除一个元素,我是否应该更改迭代器版本?
是的,通常您也应该更改Iterator的版本,只要您想允许Iterator修改列表即可。否则你应该抛出一个java.lang.UnsupportedOperationException。
看看java.util.LinkedList的迭代器如何处理修改:在添加和删除方法期间,它首先调用checkForComodification()
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
最后它会将expectedModCount增加一个:
public void add(E e) {
checkForComodification();
[...]
expectedModCount++;
}