如何编写一个by-the-book equals()方法,可能还有hashCode()?

时间:2015-02-21 13:59:14

标签: java oop netbeans equals hashcode

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

我也倾向于注意到equals()方法通常带有hashCode()方法。什么是hashCode意味着要完成它们应该如何编写?

那么,如果需要的话,我该如何编写一本书的equals()方法和一个hashCode()方法呢?


我将发布昨天最终做的两个equals()方法,如果有人需要我的程序的其他信息,请告诉我,我将添加其余的。

这是我目前的设置,不幸的是它总会打印出相同的输出(false)。

@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;
}

1 个答案:

答案 0 :(得分:1)

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

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

您可以通过以下方式实施更清晰的实施:

@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;
}
需要散列函数(hashCodeHashSet等)的数据结构使用

HashMap。它确定元素在这些数据结构中的存储位置,因此,如果两个对象相等,它们必须具有相同的hashCode。

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

例如:

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