为什么Java中的equals()必须作为参数传递Object?

时间:2014-10-21 08:43:26

标签: java object hashmap equals hashcode

当我们在Java中覆盖equals()方法时,我知道Object需要是一个参数,但我想知道 - 为什么Object

其次,我们假设我们覆盖hashcode()并实施equals(),但将equals()中的参数设置为MyClass而不是Object({{1}作为我们覆盖MyClass方法的类。如果我们使用equals(),我们仍会得到预期的行为吗?

更新:是的,它会超载而不是覆盖。但是,如果我们将HashMap与重载HashMap一起使用,会发生什么?另外,我在相关帖子中找不到答案。或者是我遗失的明显事实?

2 个答案:

答案 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)来帮助将它们组合在一起。