快速失败迭代器内部如何工作?

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

故障安全在处理集合的克隆时不会引发任何异常。

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


跃然一笑
浏览 90回答 2
2回答

阿晨1998

你可以自己检查一下实现情况。让我们考虑ArrayList一个例子。它有一个内部Itr类,该iterator()方法返回该内部类的实例。该类Itr有一个expectedModCount计数器,它是用封闭的ArrayList's初始化的modCount:private class Itr implements Iterator<E> {&nbsp; &nbsp; int cursor;&nbsp; &nbsp; &nbsp; &nbsp;// index of next element to return&nbsp; &nbsp; int lastRet = -1; // index of last element returned; -1 if no such&nbsp; &nbsp; int expectedModCount = modCount;&nbsp; &nbsp; ...}当您调用 的方法Iterator(例如next()或 )时remove(),它会调用该checkForComodification()方法:&nbsp; &nbsp; final void checkForComodification() {&nbsp; &nbsp; &nbsp; &nbsp; if (modCount != expectedModCount)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new ConcurrentModificationException();&nbsp; &nbsp; }如果自创建实例以来ArrayList'modCount已递增,则会引发异常。Iterator

慕尼黑8549860

没有单一的方法可以实现这一点。ArrayList在(以及 中的其他类)的情况下java.util,迭代器保留一个int expectedModCount(“预期修改计数”),它与 的 (“修改计数”) 进行比较AbstractList,int modCount只要列表有结构修改,它就会更新;如果两个值不同,迭代器将引发异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java