Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java中的equals()必须作为参数传递给对象?_Java_Object_Hashmap_Equals_Hashcode - Fatal编程技术网

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

为什么Java中的equals()必须作为参数传递给对象?,java,object,hashmap,equals,hashcode,Java,Object,Hashmap,Equals,Hashcode,当我们在Java中重写equals()方法时,我知道Object需要是一个参数,但我想知道-为什么Object 其次,假设我们重写hashcode()并实现equals(),但将equals()中的参数设置为MyClass,而不是Object(MyClass是我们重写的equals()方法的类)。如果我们使用HashMap,我们还会得到预期的行为吗 更新:是的,它将是重载而不是重写。但是如果我们对重载的equals()使用HashMap,会发生什么呢?另外,我在相关帖子中也找不到答案。或者我缺少

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

其次,假设我们重写
hashcode()
并实现
equals()
,但将
equals()
中的参数设置为
MyClass
,而不是
Object
MyClass
是我们重写的
equals()
方法的类)。如果我们使用
HashMap
,我们还会得到预期的行为吗

更新:是的,它将是重载而不是重写。但是如果我们对重载的
equals()
使用
HashMap
,会发生什么呢?另外,我在相关帖子中也找不到答案。或者我缺少的东西很明显吗?

如果您编写的equals()方法的参数不是Object,那么您是在重载该方法,而不是重写它

现在,对于
HashMap
-
HashMap
调用等于比较键。比较键的类型为
对象
。因此,如果您使用一个参数定义了一个
equals()
方法,而该参数不是
对象
,则该方法将被
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!");
        }
    }
}

输出将为“未找到!”,这意味着我们的
equals
方法被忽略。

集合使用对象基类中的equals和hashcode方法。因此,您必须重写它们,以便自定义类提供实现。如果愿意,您可以重载equals,这适用于某些代码知道它正在处理
MyClass
的实例的情况。然而,这会产生误导

所有集合类都设计用于处理Object实例,Object提供了通用的equals方法


您不应该真的需要直接编写equals方法。您可以使用IDE生成一个,也可以使用Apache Commons()中的EqualsBuilder来帮助将其组合在一起。

“实现equals(),但将equals()中的参数设置为MyClass,而不是Object”-->那么您并没有覆盖
等于
。我不完全确定链接的URL是否回答了OP的问题,即为什么对象是parameter@seteropere我只是浏览了一下,但我也没有找到答案。的确,但是我们会像链接的URL中提到的那样,在HashMap中出现同样的意外行为吗?当然。HashMap需要连接到Object.equals的东西,它必须接受Object类型的输入。感谢Eran和Ashley frieze的回答。帮了大忙。我想我现在明白了。
    public boolean equals (SomeClass other)
    {
        if (other instanceof SomeClass) {
            return this.privateMember==((SomeClass)other).privateMember;
        }
        else { 
            return false;
        }
    }