当它们的哈希码相同时,用Java创建的2个不同对象是否可以使用相同的对象?

时间:2017-09-13 11:17:02

标签: java object hashcode equality

在Java中,我创建了两个不同的对象(比如Person类),我已经覆盖了hashCode和equals方法。

这两个对象具有相同的哈希码,并且它们的内容完全相同。

我显示了2个对象的这个引用,但两个对象都具有相同的值。怎么可能这样呢?

请按照我的想法解释这个概念,每当我们创建对象时,这个引用总是很独特。

当两个对象具有SAME哈希码时,这会引用RETURN相同的值吗?

import java.util.*;
class Complex  extends Object{ 
    private double re, im;

    public Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }  
    public void  display() {         
         String str = "Address of  object is " + this +" Hashcode is " +hashCode() +" Real " +re+" Imaginary "+im;
         System.out.println(str);
    }
    // Overriding equals method
    public boolean equals(Object o) {

        // If the object is compared with itself then return true  
        if (o == this) {
            return true;
        }     

        // typecast o to Complex so that we can compare data members 
        Complex c = (Complex) o;

        // Compare the data members and return accordingly 
        return Double.compare(re, c.re) == 0 && Double.compare(im, c.im) == 0;
    }
    public int hashCode() {
        return Objects.hash(im,re);
    }
}

// Driver class to test the Complex class
public class ComplexEqualsDemo {

    public static void main(String[] args) {
        Complex c1 = new Complex(10D, 15.01D);
        Complex c2 = new Complex(10D, 15.01D);
        c1.display();
        c2.display();
        if (c1 == c2)
            System.out.println("Equal  == operator ");
        else
            System.out.println("NOT Equal using == operator ");     

        if (c1.equals(c2)) {
            System.out.println("Equal - using equals method ");
        } else {
            System.out.println("Not Equal -  using equals method ");            
        }
        System.out.println("\nWatch this !!!! ");
       Complex c3 = c1;
        c1.display();
        c3.display();
        if (c1 == c3)
            System.out.println("Equal  == operator ");
        else
            System.out.println("NOT Equal using == operator ");     

        if (c1.equals(c3)) {
            System.out.println("Equal - using equals method ");
        } else {
            System.out.println("Not Equal -  using equals method ");            
        }
    }
}

4 个答案:

答案 0 :(得分:2)

  

用Java创建的两个不同对象是否具有相同的this

不,根据定义。

  

当他们的hashCode相同时?

不相关。

  

我显示了2个对象的这个引用,但两个对象都具有相同的值。怎么可能这样呢?

不是。在Java中你无法 显示'值' this。你以某种方式欺骗了自己。

答案 1 :(得分:2)

单独创建的任何两个对象永远不能具有相同的内存引用。

  

请按照我的想法解释这个概念,每当我们创建对象时,这个引用总是很独特。

我认为您可以将 this 关键字放在SysOut语句中,如下所示,

System.out.println(this);

上面的语句会导致toString()在相应的Object上执行。现在,Object类中toString()的默认实现如下所示。

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

由于您已重写hashCode()以返回您创建的两个对象的相同值,因此toString()会为两个对象返回相同的值。因此,您在SysOut上看到了相同的值。

答案 2 :(得分:0)

你正在混合概念,哈希码与实例的相等性无关......

2个不同的对象可以肯定具有相同的哈希码,并且它们不需要相等......

考虑这段代码:

System.out.println("Aa".hashCode());
System.out.println("BB".hashCode());

你可以看到两个字符串完全不同但是具有相同的哈希码 2112

想象你是一个对象,哈希码就是你的生日

你可以在这个世界上找到另一个不是你的人,但却分享同样的日子......

另一方面,您和您的克隆不仅仅是同一个人,而是共享相同的信息和相同的b-day或哈希码......

答案 3 :(得分:0)

根据java文档

hashCode的一般合约是:

  

每当在同一个对象上多次调用它时   执行Java应用程序时,hashCode方法必须始终如一   返回相同的整数,前提是equals中没有使用的信息   对象的比较被修改。不需要保留该整数   从一个应用程序的执行到另一个执行的一致性   相同的申请。

     

如果两个对象根据equals(Object)方法相等,那么   必须在两个对象中的每一个上调用hashCode方法   相同的整数结果。

     

如果两个对象根据不相等而不是必需的   equals(java.lang.Object)方法,然后调用hashCode方法   两个对象中的每一个都必须产生不同的整数结果。   但是,程序员应该意识到产生了不同的   不等对象的整数结果可以提高性能   哈希表。

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)

您可以参考https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--