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

众所周知,、等Iterator返回的 s是快速失败的,但在使用迭代器时不会抛出。如何?ArrayListHashMapHashSetremove()ConcurrentModificationException

ConcurrentModificationException如果在迭代集合时修改了集合,则快速失败迭代器将抛出。但是在从迭代器的 中删除元素ArrayListHashSet使用迭代器时remove(),不会抛出任何ConcurrentModificationException. 请详细解释。

谢谢


慕后森
浏览 174回答 2
2回答

慕容3067478

但是在使用迭代器的 remove() 时不会抛出 ConcurrentModificationException。如何?因为这种行为是明确记录的。对于ArrayList:如果在迭代器创建后的任何时间对列表进行结构修改,除了通过迭代器自己的方法remove或add方法之外的任何方式,迭代器都会抛出一个ConcurrentModificationException.对于HashSet:如果在迭代器创建后的任何时间修改了集合,除了通过迭代器自己的remove方法以外的任何方式,迭代器都会抛出一个ConcurrentModificationException.相反,如果您要问这是如何实现的,那么源代码(至少对于 OpenJDK)是免费提供的(并且可能可以直接从您的 IDE 中进行探索):)

温温酱

它是通过以下方式实现的:该集合包含一个private int名为modificationCount(或类似名称)的成员。每次您使用修改集合的方法之一时,该成员modificationCount都会增加。在集合上创建迭代器时,迭代器会注意到集合的当前值modificationCount,并且每次调用迭代器时都会确保modificationCount没有改变,从而确保迭代时集合没有被修改. 如果迭代器发现它modificationCount发生了变化,它会抛出一个ConcurrentModificationException.当您通过 删除时iterator,迭代器不会增加modificationCount集合的 。就是这么简单。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java