当我们将2个对象的哈希码指向一个地址时,为什么它是临时的?

时间:2017-01-07 05:36:15

标签: java hashcode

此处Equals_to_operator是一个类,并且具有参数化构造函数public Equals_to_operator(int dd, int mm, int yy)ef是两个对象,它使用相同的参数调用参数化构造函数。 我已经覆盖hashCode并使对象的hashCode相同。 尽管使哈希码相同(对象的内存位置相同),但它给出了输出:不等于

我想通过使hashcode相同来执行相同的操作,我出错了?

   public class Equals_to_operator {
    private int dd,mm,yy;

    public Equals_to_operator(int dd, int mm, int yy) {

        this.dd = dd;
        this.mm = mm;
        this.yy = yy;
    }
    @Override
    public String toString() {
        return "Equals_to_operator [dd=" + dd + ", mm=" + mm + ", yy=" + yy + "]";
    }
    public int hashCode() {
        return 1;

    }
    public static void main(String[] args) {
        Equals_to_operator e=new Equals_to_operator(7, 1, 2016);
        System.out.println(e+"\n"+e.hashCode());
        Equals_to_operator f=new Equals_to_operator(7, 1, 2016);
        System.out.println(f+"\n"+f.hashCode());
        if (e==f)
            System.out.println("equals");
        else
            System.out.println("not equals");
    }

3 个答案:

答案 0 :(得分:2)

您似乎对equalshashCode互动的方式存在根本性的误解。这两种方法协同工作,而不是相互替代。而且,你似乎误解了这两种方法与运算符==的交互方式:它们没有; operator ==检查对象标识,因此在您的程序中,即使您正确覆盖falsehashCode,它也会返回equals

您必须始终成对覆盖这两个方法,并调用equals来检查相等性。

返回相同的哈希码会告诉基于哈希的容器您的对象可能相等,从而触发对equals的额外调用;返回不同的哈希码允许哈希容器跳过对equals的调用。

hashCodeequals的必读文件文档。

答案 1 :(得分:1)

== // checks equality in terms of memory address
something.equals(somethingElse) // enforces your own terms of what "equals" is if. If you wish to do this, override "equals()"
hashCode() // used when you're trying to use a collection such as a hashmap to map a key object to a value

你可能应该查看这些项目的文档,但是==和.equals()之间的区别是你真正需要理解的。

编辑:旁注:如果您正在查看hashCode(),那么您在某处读取了默认情况下Object的toString()表示(没有覆盖toString())是内存地址的一种形式,这是一种常见的误解。它实际上是hashCode - 但我离题了。

答案 2 :(得分:1)

  

尽管使哈希码相同(对象的内存位置相同),但它给出了输出:不等于

具有相同的哈希码并不意味着对象是相等的。

memory location of object same ...这不是哈希码的作用。从那里你得到了什么?

  

if(e == f)

如果ef都指向同一个对象,则表示条件为真。

根据您的equals方法,ef指向的对象都相同但==但检查引用相等而不是内容。