2012-10-16 63 views
5

有两种equals方法吗?有两种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; 
} 

比较2种方法,当我们要覆盖等方法,为什么我们需要定义equals方法,其参数为Object类型的!

回答

6

其实是有这个一个很好的理由:

  • 您需要equals(Object)方法来覆盖超等于在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); 
} 

这种方式是更简洁,意味着你只需要一次实现平等的测试逻辑(不要重复自己!)。

2

的框架/调用equals()方法(如在containsKey()地图,在词典等)调用从对象类的覆盖equals()和不重载的版本的API。因此,您需要需要来定义public boolean equals(Object obj)