此问题已经在这里有了答案:
我知道什么是快速失败和故障安全迭代器。如果对集合进行了结构修改,则快速失败迭代器会立即引发ConcurrentModificationException。
Fail-Safe dosnt在收集的克隆上工作时会引发任何异常。
我的问题是快速失败迭代器如何知道对我的集合进行了修改?
没有办法。
[对于ArrayList
(以及java.util
中的其他类别),迭代器保留一个int expectedModCount
(“预期修改计数”),并将其与int expectedModCount
的AbstractList
(“修改count”),只要对列表进行结构上的修改,它就会更新;如果两个值不同,则迭代器将引发异常。
您可以自己检查实现。
让我们以int modCount
为例。
它具有一个内部int modCount
类,ArrayList
方法将返回该类的一个实例。
Itr
类具有一个iterator()
计数器,该计数器由附带的Itr
的expectedModCount
初始化:
ArrayList
[当您调用modCount
的方法,例如private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
...
}
或Iterator
时,它会调用next()
方法:
remove()
如果自创建checkForComodification()
实例以来 final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
的ArrayList
已递增,则会引发异常。