Java 若HashSet、ArrayList返回的迭代器很快就会失败,那个么我们如何使用迭代器remove()从集合中删除元素呢

Java 若HashSet、ArrayList返回的迭代器很快就会失败,那个么我们如何使用迭代器remove()从集合中删除元素呢,java,collections,Java,Collections,我们都知道,ArrayList返回的Iterator,HashMap,HashSet等都会很快失败,但在使用Iterator的remove()时不会抛出ConcurrentModificationException。怎么做 如果在对集合进行迭代时修改了集合,则快速失败迭代器将抛出ConcurrentModificationException。但是,当使用迭代器的remove()从ArrayList或HashSet中删除元素时,不会抛出任何ConcurrentModificationExcepti

我们都知道,
ArrayList
返回的
Iterator
HashMap
HashSet
等都会很快失败,但在使用Iterator的
remove()
时不会抛出
ConcurrentModificationException
。怎么做

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

谢谢

但在使用迭代器的remove()时,不会抛出ConcurrentModificationException。怎么做

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

用于:

如果在创建迭代器后的任何时候,以迭代器自己的
remove
add
方法以外的任何方式修改列表的结构,迭代器将抛出
ConcurrentModificationException

用于:

如果在创建迭代器后的任何时间,以迭代器自己的
remove
方法以外的任何方式修改集合,迭代器将抛出
ConcurrentModificationException


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

实现如下:

集合包含名为
modificationCount
private int
成员(或类似内容)。每次使用修改集合的方法之一时,此
modificationCount
都会递增。在集合上创建迭代器时,迭代器会注意集合的
modificationCount
的当前值,每次调用迭代器时,它都会确保
modificationCount
没有更改,以确保在迭代时集合没有被修改。如果迭代器发现
modificationCount
已更改,它将抛出
ConcurrentModificationException


通过
迭代器
删除时,迭代器不会增加集合的
修改计数
。就是这么简单。

为什么不看看源代码呢?它与JDK一起提供:它在调用列表的remove方法后更新expectedModCount。就这么简单。你是在问为什么会有这种行为?或者你在问这个行为是如何实现的?