1

我知道什么是故障快速和故障安全迭代器。如果集合发生结构性修改,Fail-Fast 迭代器会立即抛出 ConcurrentModificationException。

Fail-Safe 不会抛出任何异常,因为它们适用于集合的克隆。

我的问题是快速失败的迭代器如何知道对我的集合进行了修改?

4

2 回答 2

2

您可以自己检查实现。

让我们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

于 2019-10-02T11:55:41.287 回答
0

没有单一的方法可以实现这一点。

ArrayList(和 中的其他类java.util)的情况下,迭代器保留一个int expectedModCount(“预期的修改计数”),它与AbstractListint modCount(“修改计数”)进行比较,只要列表有结构修改,就会更新;如果两个值不同,迭代器会抛出异常。

于 2019-10-02T11:54:01.547 回答