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

如果 HashSet、ArrayList 返回的 Iterators 是 fail-fast

如果 HashSet、ArrayList 返回的 Iterators 是 fail-fast

慕后森 2021-09-26 18:08:10
众所周知,、等Iterator返回的 s是快速失败的,但在使用迭代器时不会抛出。如何?ArrayListHashMapHashSetremove()ConcurrentModificationExceptionConcurrentModificationException如果在迭代集合时修改了集合,则快速失败迭代器将抛出。但是在从迭代器的 中删除元素ArrayList或HashSet使用迭代器时remove(),不会抛出任何ConcurrentModificationException. 请详细解释。谢谢
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

但是在使用迭代器的 remove() 时不会抛出 ConcurrentModificationException。如何?

因为这种行为是明确记录的。

对于ArrayList

如果在迭代器创建后的任何时间对列表进行结构修改,除了通过迭代器自己的方法removeadd方法之外的任何方式,迭代器都会抛出一个ConcurrentModificationException.

对于HashSet

如果在迭代器创建后的任何时间修改了集合,除了通过迭代器自己的remove方法以外的任何方式,迭代器都会抛出一个ConcurrentModificationException.

相反,如果您要问如何实现的,那么源代码(至少对于 OpenJDK)是免费提供的(并且可能可以直接从您的 IDE 中进行探索):)


查看完整回答
反对 回复 2021-09-26
?
温温酱

TA贡献1752条经验 获得超4个赞

它是通过以下方式实现的:

该集合包含一个private int名为modificationCount(或类似名称)的成员。每次您使用修改集合的方法之一时,该成员modificationCount都会增加。在集合上创建迭代器时,迭代器会注意到集合的当前值modificationCount,并且每次调用迭代器时都会确保modificationCount没有改变,从而确保迭代时集合没有被修改. 如果迭代器发现它modificationCount发生了变化,它会抛出一个ConcurrentModificationException.

当您通过 删除时iterator,迭代器不会增加modificationCount集合的 。就是这么简单。


查看完整回答
反对 回复 2021-09-26
  • 2 回答
  • 0 关注
  • 173 浏览

添加回答

举报

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