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