我应该覆盖Object.equals(Object)方法吗?

时间:2015-01-25 15:35:32

标签: java equals equality object-comparison

我有两个同一个类的实例。

public class Gilda {
    private String nome;
    public Gilda(String nome) {
        this.nome = nome;
    }
    // More stuff
}

尝试通过Object.equals(Object)方法对其进行比较时,会返回false。 这很奇怪,因为nome在这两个实例上具有相同的值。

比较如何运作?这是预期的行为吗? 我应该覆盖那种方法吗?

2 个答案:

答案 0 :(得分:5)

是的,你必须覆盖它。如果不这样做,则使用Object本身提供的版本,默认为引用相等(它们是相同的“物理”对象)。

根据您的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;
}

答案 1 :(得分:0)

您必须覆盖equals方法 - 因此 - 您必须用它覆盖hashCode。