16

对于 java 中的 Hashset,有一个 .equals 方法比较每个集合中的元素。无论顺序如何,这都会返回 true 吗?

例如,假设我们有一个包含元素 {a,b,c} 的集合和另一个包含元素 {b,c,a} 的集合

如果你在这两个集合上使用 .equals ,它会返回 true,还是必须排序?

4

5 回答 5

12

这应该返回 true。文档说:

比较指定对象与此集合是否相等。如果给定对象也是一个集合,则返回 true,这两个集合具有相同的大小,并且给定集合的每个成员都包含在该集合中。这确保了 equals 方法在 Set 接口的不同实现中正常工作。

于 2013-01-28T04:40:23.570 回答
8

JavaHashSet是无序的——它们没有排序。因此,您的问题根本无法按提出的方式提出。集合{a,b,c}与集合相同{b,c,a}。也就是说,HashSetinherit'sAbstractSet#equals(Object)告诉我们以下内容:

比较指定对象与此集合是否相等。返回true给定对象是否也是一个集合,这两个集合具有相同的大小,并且给定集合的每个成员都包含在这个集合中。这可确保该方法在接口equals的不同实现中正常工作。Set

于 2013-01-28T04:39:24.893 回答
2

HashSet实现Set接口(建模数学集合抽象),它不包含顺序信息,因此排序在集合中没有意义。结果,equalsin aSet只考虑成员而无视成员的命令。

于 2013-01-28T04:39:17.093 回答
2

是的,这将是真的,因为 Set 没有隐含的顺序。

您可以通过添加比较器或使用 Set 的特殊情况(例如 TreeSet)将顺序应用于集合。

顺便说一下,哈希码用于在 Set 中进行快速比较。根据 equals 合约,任何两个被认为“相等”的对象必须具有相同的哈希码。

这意味着在不太可能发生哈希码冲突的情况下,Set 只需回退到更耗时的方法。

于 2013-01-28T04:40:18.403 回答
1

哈希本质上是一个无序列表,所以是的,

如果哈希 A 包含 {1,2,3,4,5},哈希 B 包含 {3,1,5,4,2},那么它们将相等。

于 2013-01-28T04:39:32.380 回答