HashSet中的.equals方法是否忽略顺序并返回true?

19

在Java中的哈希集合(Hashset)中,有一个.equals方法用于比较每个集合中的元素。

无论顺序如何,这个方法都会返回true吗?例如,假设我们有一个包含{a,b,c}元素的集合和另一个包含{b,c,a}元素的集合,如果你对这两个集合使用.equals方法,它会返回true吗?还是必须将它们排序?

5个回答

14

这应该返回true。 文档说:

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


12

HashSet没有顺序

Java HashSet是无序的 - 它们没有排序。因此,您的问题不能像提出的那样进行提问。例如,集合{a,b,c}与集合{b,c,a}相同。尽管如此,HashSet继承了AbstractSet#equals(Object),它告诉我们以下内容:

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


2

HashSet 实现了 Set 接口(模拟数学中的集合抽象),集合中不包含任何顺序信息,因此排序在集合中没有意义。因此,在 Set 中,equals 只考虑成员而忽略成员的顺序。


2
是的,这是正确的,因为Set没有隐式顺序。
您可以通过添加比较器或使用特殊情况的Set(例如TreeSet)来对Set应用顺序。
顺便说一下,哈希码用于在Set中进行快速比较。根据等式合同,任何被视为“相等”的两个对象必须具有相同的哈希码。
这意味着,在哈希码冲突的极少情况下,Set只需回退到更耗时的方法。

1

是的,HashSet 是一个无序的唯一元素列表,这意味着元素的顺序对相等性没有影响。

以下是演示说明此点。

import java.util.HashSet;

public class TestHashSet 
{
    public static void main(String[] args) 
    {
        HashSet<Integer> set1 = new HashSet<Integer>() {{
            add(1);
            add(2);
            add(3);
            add(4);
            add(5);
        }};
        HashSet<Integer> set2 = new HashSet<Integer>() {{
            add(3);
            add(1);
            add(5);
            add(4);
            add(2);
        }};
        System.out.println("set1 is equal to set2: " + set1.equals(set2));
    }
}

1
哈希本质上是一个无序列表,更不用说微小的“元素唯一性”细节了。 - Matt Ball
@MattBall 你说得对,我忘了提到这一点,我已经修改了我的帖子以反映你的更正。 - Dmytro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接