我应该覆盖 Object.equals(Object) 方法吗?
Should I override the Object.equals(Object) method?
我有两个相同的实例 class。
public class Gilda {
private String nome;
public Gilda(String nome) {
this.nome = nome;
}
// More stuff
}
当尝试通过 Object.equals(Object)
方法比较它们时,它 returns false
。
这很奇怪,因为 nome
在这两个实例上具有相同的值。
比较是如何进行的?这是预期的行为吗?
我应该覆盖该方法吗?
是的,您必须覆盖它。如果不这样做,您将使用 Object
本身提供的版本,该版本默认引用相等性(它们是相同的 "physical" 对象)。
根据您的 IDE,这可能会自动为您编写。例如,IntelliJ 14 刚刚为我写了这个:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Gilda gilda = (Gilda) o;
if (nome != null ? !nome.equals(gilda.nome) : gilda.nome != null) return false;
return true;
}
当然,不要忘记 hashCode
,它应该始终与 equals
同时完成:
@Override
public int hashCode() {
return nome != null ? nome.hashCode() : 0;
}
您必须覆盖 equals 方法 - 因此 - 您必须用它覆盖 hashCode。
我有两个相同的实例 class。
public class Gilda {
private String nome;
public Gilda(String nome) {
this.nome = nome;
}
// More stuff
}
当尝试通过 Object.equals(Object)
方法比较它们时,它 returns false
。
这很奇怪,因为 nome
在这两个实例上具有相同的值。
比较是如何进行的?这是预期的行为吗? 我应该覆盖该方法吗?
是的,您必须覆盖它。如果不这样做,您将使用 Object
本身提供的版本,该版本默认引用相等性(它们是相同的 "physical" 对象)。
根据您的 IDE,这可能会自动为您编写。例如,IntelliJ 14 刚刚为我写了这个:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Gilda gilda = (Gilda) o;
if (nome != null ? !nome.equals(gilda.nome) : gilda.nome != null) return false;
return true;
}
当然,不要忘记 hashCode
,它应该始终与 equals
同时完成:
@Override
public int hashCode() {
return nome != null ? nome.hashCode() : 0;
}
您必须覆盖 equals 方法 - 因此 - 您必须用它覆盖 hashCode。