当我们在Java中覆盖equals()
方法时,我知道Object
需要是一个参数,但我想知道 - 为什么Object
?
其次,我们假设我们覆盖hashcode()
并实施equals()
,但将equals()
中的参数设置为MyClass
而不是Object
({{1}作为我们覆盖MyClass
方法的类。如果我们使用equals()
,我们仍会得到预期的行为吗?
更新:是的,它会超载而不是覆盖。但是,如果我们将HashMap
与重载HashMap
一起使用,会发生什么?另外,我在相关帖子中找不到答案。或者是我遗失的明显事实?
答案 0 :(得分:2)
如果你编写一个参数不是Object的equals()方法,你就会重载该方法,而不是覆盖它。
现在,至于HashMap
- HashMap
调用等于比较键。比较密钥的类型为Object
。因此,如果您使用非equals()
的参数定义Object
方法,HashMap
将忽略此方法。
我尝试了以下代码:
public class SomeClass
{
int privateMember;
// note it's important to override hashCode, since if the hashCode of two
// keys is not the same, equals() won't be called at all
public int hashCode ()
{
return privateMember;
}
public boolean equals (Object other)
{
if (other instanceof SomeClass) {
return this.privateMember==((SomeClass)other).privateMember;
}
else {
return false;
}
}
public static void main(String[] args)
{
HashMap<SomeClass,String> map = new HashMap<SomeClass,String>();
SomeClass s1 = new SomeClass ();
SomeClass s2 = new SomeClass ();
s1.priv=4;
s2.priv=4;
map.put (s1, "something");
if (map.containsKey (s2)) {
System.out.println ("found!");
} else {
System.out.println ("not found!");
}
}
}
此代码输出“found!”。
现在,如果您运行完全相同的代码,但将equals
方法替换为:
public boolean equals (SomeClass other)
{
if (other instanceof SomeClass) {
return this.privateMember==((SomeClass)other).privateMember;
}
else {
return false;
}
}
输出将“未找到!”,这意味着我们忽略了equals
方法。
答案 1 :(得分:0)
集合使用Object基类中的equals和hashcode方法。因此,您必须覆盖它们,以便您的自定义类提供实现。如果您愿意,可以重载equals,这适用于某些代码知道它正在处理MyClass
实例的情况。但是,这会产生误导。
所有集合类都设计为使用Object和Object的实例提供通用等于方法。
你不应该直接写一个equals方法。您可以使用IDE生成一个,也可以使用Apache Commons的EqualsBuilder(https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/builder/EqualsBuilder.html)来帮助将它们组合在一起。