我正在学习覆盖hashCode()
课程的equals(Object obj)
和Object
方法。
equals(Object obj)
类Object
方法的主体是:
public boolean equals(Object obj) {
return (this == obj);
}
且hashCode()
为native
:
public native int hashCode();
我的课程Test
已被覆盖equals(Object obj)
和hashCoe()
:
public class Test {
public static void main(String[] args){
Test t1 = new Test();
Test t2 = new Test();
System.out.println("t1 toString() : " + t1.toString());
System.out.println("t1, Hex value of hashcode : " + Integer.toHexString(t1.hashCode()));
System.out.println("t2 toString() : " + t2.toString());
System.out.println("t2, Hex value of hashcode : " + Integer.toHexString(t2.hashCode()));
System.out.println(t1.equals(t2));
}
@Override
public int hashCode() {
return 999; //hard coded value is just for testing
}
@Override
public boolean equals(Object obj) {
return (this == obj);
}
}
我的代码输出是:
t1 toString() : demo.Test@3e7
t1, Hex value of hashcode : 3e7
t2 toString() : demo.Test@3e7
t2, Hex value of hashcode : 3e7
false //why it is false
如果两个对象equals(Object obj)
都返回相同的引用ID( hashcode ),false
在这种情况下会返回toString()
的原因[我不确定它是否会比较哈希码或不]。
==
运算符在对象的情况下实际比较了什么?
在this回答中,回答者说 ==
也就是说,当且仅当两个变量都引用同一个对象时,如果它们的引用是同一个,它返回true
如何知道变量引用同一个对象 ???
答案 0 :(得分:6)
它如何知道变量引用同一个对象?
因为变量的值是相同的引用。 (您的变量是t1
和t2
。这些变量的值是引用。这些引用基本上用作导航到对象的方式。)
假设你和我都有一张带有房子街道地址的纸张(这是我通常用“引用变量”的类比)。我们如何检查他们是否指的是同一所房子?我们看看地址是否相同。
这里有一些潜在的变化,因为在某些情况下,参考的形式可能在两个表达式之间不一样,但这是基本的想法。
(注意,仅仅因为我在类比中使用了“地址”,这并不意味着Java引用总是一个内存地址。它是“一种导航到一个对象的方式”,就是这样。它可能或者可能不只是一个地址。)
来自JVM规范section 2.2:
Java虚拟机包含对对象的显式支持。对象是动态分配的类实例或数组。对对象的引用被视为具有Java虚拟机类型引用。 类型引用的值可以被认为是指向对象的指针。可能存在多个对象的引用。对象始终通过类型引用的值进行操作,传递和测试。
答案 1 :(得分:0)
==将检查两个引用是否相同。你有两个不同的对象,无论它们是等价的,它们指向不同的内存块。
此规则的唯一例外是String,在特殊条件下(即调用.intern()方法),但这是一个特殊情况,与字符串池有关。
答案 2 :(得分:0)
如果与==
equals进行比较,则Object的实例需要相同(指向同一引用的指针," JVM中的相同id")。检查对象的哈希码。
这就是为什么在Java中与equals(..)
进行比较是一个好习惯。
这里有一些代码:
Test o1 = new Test();
Test o2 = new Test();
//You can check the ids with System#identityHashCode(Object):
System.out.println(System.identityHashCode(o1));
System.out.println(System.identityHashCode(o2));
o1 == o1 // will be true
o1 == o2 // will be false
o1.equals(o2) //depends on how you have implemented equals() and hashCode() in the Test Object.
hashCode和Equals之间的合约是:
.equals()
的对象必须具有相同的.hashCode()
反向陈述不一定是真的。
在您的示例中,情况确实如此:您在999
中返回.hashCode()
并比较.equals()
中的jvm ID。
答案 3 :(得分:-1)
==检查两个对象是否引用内存中的相同位置。换句话说,它检查2个对象名称是否基本上引用了相同的内存位置
EX1:
String obj1 = new String(“xyz”);
String obj2 = new String(“xyz”);
OBJ1 == OBJ2; //假
EX2
String obj1 = new String(“xyz”);
String obj2 = obj1;
OBJ1 == OBJ2; //真