如何编写一个可能与 hashCode() 一起使用的 equals() 方法?

How to write a by-the-book equals() method, possibly with hashCode()?

您将如何编写 equals() 方法?我需要能够编写一个可用的程序来比较程序中的纸牌。我正在使用 NetBeans 编写代码。

我还注意到 equals() 方法通常与 hashCode() 方法一起提供。 hashCode到底是做什么用的,应该怎么写?

那么,如果我需要的话,我应该如何编写一个循序渐进的 equals() 方法和一个 hashCode() 方法?


我将 post 我昨天完成的两个 equals() 方法,如果有人特别需要关于我的程序的额外信息,请告诉我,我会添加其余的。

这是我当前的设置,不幸的是它总是打印出相同的输出(错误)。

@Override
public boolean equals(Object otherObject)
    {
       boolean set = false;
       if (!(otherObject instanceof PlayingCard))
       {
          set = false;
       }

       if (otherObject == this)
       {
          set = true;
       }
       System.out.println(set);
       return set;
    }

这是(我认为)我使用的原始 equals() 方法。

@Override
public boolean equals(Object otherObject)
{
if (otherObject == null)
{
    System.out.println("Match");
    return false;
}
if (getClass() != otherObject.getClass())
{
    System.out.println("Match");
    return false;
}

System.out.println("No Match, True");
PlayingCard other = (PlayingCard) otherObject;
return suit.equals(other.suit) && rank == other.rank;
}

您的 equals 方法应该比较确定相等性的对象的属性。

因此,第二个版本比第一个版本更有意义(因为第一个版本只测试引用相等性,这已经在 Object class 的默认实现中完成)。

不过你可以有一个更简洁的实现:

@Override
public boolean equals(Object otherObject)
{
    if (otherObject == null)
    {
        return false;
    }
    if (!(otherObject instanceof PlayingCard))
    {
        return false;
    }
    if (this == otherObject) {
        return true;
    }
    PlayingCard other = (PlayingCard) otherObject;
    return suit.equals(other.suit) && rank == other.rank;
}

hashCode 用于需要散列函数的数据结构(HashSetHashMap 等)。它决定了元素将存储在此类数据结构中的何处,因此,如果两个对象相等,则它们必须具有相同的 hashCode。

换句话说,您的 hashCode 实施应该与 equals 实施相匹配,这样如果 a.equals(b) 那么 a.hashCode() == b.hashCode()。因此,在您的示例中,hashCode 应该是 suitrank 属性的函数。

例如:

@Override
public int hashCode ()
{
    return Objects.hash(suit,rank);
}