有两种equals()方法

and*_*qee 5 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 == first && b.second == second;
}
Run Code Online (Sandbox Code Playgroud)

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

mik*_*era 6

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

  • 您需要该equals(Object)方法来覆盖超类equals方法java.lang.Object
  • 您通常需要一个重载equals(Bigram)方法来处理编译器在编译时可以证明该类型是Bigram的情况.这样可以避免类型检查/转换,从而提高性能,并为代码提供更好的类型检查.
  • 最后,您可能希望以特殊方式实现equals,以便与不是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);
}
Run Code Online (Sandbox Code Playgroud)

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