我知道什么是故障快速和故障安全迭代器。如果集合发生结构性修改,Fail-Fast 迭代器会立即抛出 ConcurrentModificationException。
Fail-Safe 不会抛出任何异常,因为它们适用于集合的克隆。
我的问题是快速失败的迭代器如何知道对我的集合进行了修改?
我知道什么是故障快速和故障安全迭代器。如果集合发生结构性修改,Fail-Fast 迭代器会立即抛出 ConcurrentModificationException。
Fail-Safe 不会抛出任何异常,因为它们适用于集合的克隆。
我的问题是快速失败的迭代器如何知道对我的集合进行了修改?
您可以自己检查实现。
让我们ArrayList
作为一个例子来考虑。
它有一个内部Itr
类,该iterator()
方法返回一个实例。
该类Itr
有一个expectedModCount
计数器,它用封闭ArrayList
的 's初始化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()
or remove()
,它会调用该checkForComodification()
方法:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
如果自创建实例以来ArrayList
'smodCount
已增加,则会引发异常。Iterator
没有单一的方法可以实现这一点。
在ArrayList
(和 中的其他类java.util
)的情况下,迭代器保留一个int expectedModCount
(“预期的修改计数”),它与AbstractList
的int modCount
(“修改计数”)进行比较,只要列表有结构修改,就会更新;如果两个值不同,迭代器会抛出异常。