在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 ");
}
}
}
答案 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--