Java 有两种equals()方法吗

Java 有两种equals()方法吗,java,overriding,equals,Java,Overriding,Equals,有两种方法 public boolean equals(Bigram b) { return b.first == first && b.second == second; } @Override public boolean equals(Object o) { if (!(o instanceof Bigram)) return false; Bigram b = (Bigram) o; return b.first

有两种方法

public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
    }

@Override public boolean equals(Object o) {
    if (!(o instanceof Bigram))
        return false;
    Bigram b = (Bigram) o;
    return b.first == first && b.second == second;
}

与这两种方法相比,当我们想要覆盖相等方法时,为什么我们需要定义一个参数为类型Object的相等方法

这实际上有一个很好的理由:

  • 您需要
    equals(Object)
    方法来覆盖
    java.lang.Object
  • 您通常还需要一个重载的
    equals(Bigram)
    方法来处理编译器可以在编译时证明类型是Bigram的情况。这通过避免类型检查/转换来提高性能,并在代码中提供更好的类型检查
  • 最后,您可能希望以一种特殊的方式实现equals,以便用equality测试本身不是Bigram实例的对象。这应该小心使用(您真的希望不是Bigram实例的东西被视为等同于Bigram吗?),但它确实有一些有效的应用程序(例如,比较不同类型集合对象的内容)
但是,通常最好实现它们,以便一个方法调用另一个方法,例如:

public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
}

@Override public boolean equals(Object o) {
    if (!(o instanceof Bigram)) return false;
    return equals((Bigram)o);
}

这种方法更简洁,意味着您只需要实现一次相等测试逻辑(不要重复!)。

调用
equals()
方法的框架/API(如
containsKey()
在映射中,
包含()
在列表中等)调用重写的
equals()
来自对象类,而不是重载版本。因此,您需要定义
公共布尔等于(Object obj)

,因为在重写的情况下,您无法缩小方法参数的范围,是返回类型可以是子类型请检查下面的链接