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
- 您通常还需要一个重载的
方法来处理编译器可以在编译时证明类型是Bigram的情况。这通过避免类型检查/转换来提高性能,并在代码中提供更好的类型检查equals(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)
,因为在重写的情况下,您无法缩小方法参数的范围,是返回类型可以是子类型请检查下面的链接