obj1 == obj2实际比较了什么

时间:2014-07-15 07:58:08

标签: java object equals hashcode equality

我正在学习覆盖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

如何知道变量引用同一个对象 ???

4 个答案:

答案 0 :(得分:6)

  

它如何知道变量引用同一个对象?

因为变量的值是相同的引用。 (您的变量是t1t2。这些变量的值是引用。这些引用基本上用作导航到对象的方式。)

假设你和我都有一张带有房子街道地址的纸张(这是我通常用“引用变量”的类比)。我们如何检查他们是否指的是同一所房子?我们看看地址是否相同。

这里有一些潜在的变化,因为在某些情况下,参考的形式可能在两个表达式之间不一样,但这是基本的想法。

(注意,仅仅因为我在类比中使用了“地址”,这并不意味着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; //真