2 回答
TA贡献1773条经验 获得超3个赞
但是在使用迭代器的 remove() 时不会抛出 ConcurrentModificationException。如何?
因为这种行为是明确记录的。
对于ArrayList
:
如果在迭代器创建后的任何时间对列表进行结构修改,除了通过迭代器自己的方法
remove
或add
方法之外的任何方式,迭代器都会抛出一个ConcurrentModificationException
.
对于HashSet
:
如果在迭代器创建后的任何时间修改了集合,除了通过迭代器自己的
remove
方法以外的任何方式,迭代器都会抛出一个ConcurrentModificationException
.
相反,如果您要问这是如何实现的,那么源代码(至少对于 OpenJDK)是免费提供的(并且可能可以直接从您的 IDE 中进行探索):)
TA贡献1752条经验 获得超4个赞
它是通过以下方式实现的:
该集合包含一个private int
名为modificationCount
(或类似名称)的成员。每次您使用修改集合的方法之一时,该成员modificationCount
都会增加。在集合上创建迭代器时,迭代器会注意到集合的当前值modificationCount
,并且每次调用迭代器时都会确保modificationCount
没有改变,从而确保迭代时集合没有被修改. 如果迭代器发现它modificationCount
发生了变化,它会抛出一个ConcurrentModificationException
.
当您通过 删除时iterator
,迭代器不会增加modificationCount
集合的 。就是这么简单。
添加回答
举报