你会如何编写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;
}
答案 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;
}
需要散列函数(hashCode
,HashSet
等)的数据结构使用 HashMap
。它确定元素在这些数据结构中的存储位置,因此,如果两个对象相等,它们必须具有相同的hashCode。
换句话说,您的hashCode
实施应与equals
实施相匹配,如果a.equals(b)
则a.hashCode() == b.hashCode()
。因此,在您的示例中,hashCode
应该是suit
和rank
属性的函数。
例如:
@Override
public int hashCode ()
{
return Objects.hash(suit,rank);
}