1

我是 java 新手,对 Hashset 有疑问。

如果我们在创建迭代器后添加重复元素,有人可以解释一下为什么我们不会得到 ConcurrentModificationException 吗?无论如何,我们正在改变它的结构,即使添加重复元素,它也应该抛出异常。有人可以解决我的疑问..

4

3 回答 3

7

添加重复元素不会修改集合,因为根据定义,集合仅包含每个元素之一。这在Set.add的 javadoc 中有说明:

如果指定的元素尚不存在,则将其添加到此集合中。更正式地说,如果此集合不包含元素 e2,则将指定的元素 e 添加到此集合中,使得 (e==null ? e2==null : e.equals(e2))。如果该集合已包含该元素,则调用将保持该集合不变并返回 false。

于 2013-07-26T11:54:12.303 回答
2

文档中:

此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,除了通过迭代器自己的 remove 或 add 方法之外的任何方式,迭代器将抛出 ConcurrentModificationException。因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。

请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。

于 2013-07-26T11:54:12.913 回答
0

根据定义,集合仅包含唯一对象。添加操作分为两个过程:首先检查对象是否已经存在于集合中,如果不存在则添加它。

当我们要添加到 Set 的项目已经存在时,不会更改任何内容,因此不会发生异常。

于 2013-07-26T11:59:53.760 回答