加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 失败快速迭代器实现

发布时间:2020-12-14 16:22:48 所属栏目:Java 来源:网络整理
导读:有类似的问题,但不完全是我想问的问题. 我想问一下Iterator如何检查修改. This link说它的实现存在于AbstractList类中,其中定义了一个int变量modCount,它提供了列表大小已被更改的次数.在每次next()调用中使用此值来检查函数checkForComodification()中的任
有类似的问题,但不完全是我想问的问题.
我想问一下Iterator如何检查修改.

This link说它的实现存在于AbstractList类中,其中定义了一个int变量modCount,它提供了列表大小已被更改的次数.在每次next()调用中使用此值来检查函数checkForComodification()中的任何修改.

但我真的不明白.如果仅在每次下一次调用后检查该值,那么如果我执行删除,然后添加相同的调用,则大小不会更改,并且modCount也不应更改.但删除和添加相同的循环迭代也会抛出异常.

解决方法

如果你看一下Collection实现的代码,让我们选择ArrayList;我们在AbstractList中声明了一个modCount变量:
protected transient int modCount = 0;

然后在我们拥有的ArrayList的每个修改方法(例如remove)中

public E remove(int index) {
    rangeCheck(index);

    modCount++;
    //....

所以modCount只会递增;它永远不会减少.

在Iterator中我们有:

final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

其中expectedModCount是创建迭代器时采用的modCount的快照.

因此,如果在使用Iterator的同一实例时对底层List进行任何修改,则将抛出ConcurrentModificationException.

我想有一个角落的情况,如果你进行了足够的修改,那么int会溢出并再次返回它的原始值 – 这将是一个相当大的数字或修改但是;确切地说是232.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读