为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

跃然一笑 2023-09-20 14:35:20
我知道什么是快速失败和故障安全迭代器。如果集合发生结构修改,快速失败迭代器会立即抛出 ConcurrentModificationException。故障安全在处理集合的克隆时不会引发任何异常。我的问题是快速失败迭代器如何知道对我的集合进行了修改?
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

你可以自己检查一下实现情况。


让我们考虑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()或 )时remove(),它会调用该checkForComodification()方法:


    final void checkForComodification() {

        if (modCount != expectedModCount)

            throw new ConcurrentModificationException();

    }

如果自创建实例以来ArrayList'modCount已递增,则会引发异常。Iterator


查看完整回答
反对 回复 2023-09-20
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

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

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


查看完整回答
反对 回复 2023-09-20
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信