【问题标题】:How does contains-Method in HashSets work?HashSets 中的 contains-Method 是如何工作的?
【发布时间】:2015-10-31 12:40:07
【问题描述】:

contains-method 如何判断某个对象是否在 HashSet 中?我创建了一个带有两个实例变量的类。然后我将一些实例放入 HashSet。我再次创建了相同的实例(具有相同的实例变量值)并将它们用作包含方法的输入。尽管是相同的对象,但“包含”每次都返回 false。 所以,我想知道是否只检查引用或对象的值。如果我必须拥有相同的对象,并且将一个对象放入 HashSet 并使用另一个对象调用“包含”方法,那么该方法将返回 true 还是 false? 如果为假,我该怎么做才能返回真?

【问题讨论】:

  • 那是什么语言?爪哇?
  • 该文档告诉您在哈希集的特定情况下contains 的合同。它告诉你它如何认为 2 个对象是同一个键。
  • 哦,是的,对不起。这是JAVA..
  • 如果您将自定义类的实例存储在HashSet(或任何Set)中,请确保正确覆盖该类中的equalshashCode 方法。否则,Set 中的两个对象仅在它们是同一对象 (==) 时才被视为相等。

标签: java collections set contains hashset


【解决方案1】:

多个对象相同时是否匹配取决于 equals() 和 hashCode() 的实现方式。例如,对于 A 类,每个对象都是相同的,因为它只有一个 final 字段设置为常量。

public static class A {
    final int a=2;
}

但 HashSet 将包含一个视为包含另一个:

 A a1 = new A();
 HashSet<A> hsA = new HashSet<>();
 hsA.add(a1);
 A a2 = new A();
 System.out.println("hsA.contains(a2) = " + hsA.contains(a2));

B 类是相同的,但覆盖了 hashCode() 和 equals():

public static class B {

    final int a = 2;

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 17 * hash + this.a;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final B other = (B) obj;
        if (this.a != other.a) {
            return false;
        }
        return true;
    }

}

运行几乎相同的代码:

    B b1 = new B();
    HashSet<B> hsB = new HashSet<>();
    hsB.add(b1);
    B b2 = new B();
    System.out.println("hsB.contains(b2) = " + hsB.contains(b2));

产生不同的值。输出是:

hsA.contains(a2) = 假
hsB.contains(b2) = true

大多数 IDE 都有生成 hashCode() 和 equals() 的选项,以便对象是否匹配完全取决于您指定的字段。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2016-10-20
    • 2012-06-14
    • 2021-05-02
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多