栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在此示例中没有得到java.util.ConcurrentModificationException?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在此示例中没有得到java.util.ConcurrentModificationException?

原因如下:正如

Javadoc
中所说:

此类的迭代器和

listIterator
方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间以任何方式对列表进行结构修改,除非通过迭代器自己的remove或add方法,否则迭代器将抛出
ConcurrentModificationException

该检查是在

next()
迭代器的方法中完成的(如你在stacktrace中所看到的)。但是,next()只有在
hasNext()
传递的结果为
true
时,我们才能实现该方法,这是每个方法调用此方法以检查是否满足边界的要求。在你的
remove
方法中,当
hasNext()
检查是否需要返回另一个元素时,将看到它返回了两个元素,现在在删除一个元素之后,列表仅包含两个元素。因此,一切都变桃了,我们已经完成了迭代。不会进行并发修改检查,因为这是在
next()
从未调用过的方法中完成的。

接下来,我们进入第二个循环。在删除第二个数字之后,hasNext方法将再次检查是否可以返回更多值。它已经返回了两个值,但是列表现在只包含一个。但是这里的代码是:

public boolean hasNext() {        return cursor != size();}

1!= 2
,因此我们继续执行该
next()
方法,该方法现在意识到有人一直在弄乱列表并触发异常。

希望能解决你的问题。

摘要

List.remove()ConcurrentModificationException
从列表中删除倒数第二个元素时不会抛出该异常。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414873.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号