JVM在Java对象相等(=)中检查什么?

JVM在Java对象相等(=)中检查什么?,java,Java,JVM在对象相等性(==)中检查什么?是两个对象的hashCode还是其他什么?操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象 在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象

JVM在对象相等性(
==
)中检查什么?是两个对象的hashCode还是其他什么?

操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象


在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。

操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象


在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。

操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象


在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。

操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象


在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。

使用==来比较对象引用。它只是检查两个对象是否指向同一引用。

使用==来比较对象引用。它只是检查两个对象是否指向同一引用。

使用==来比较对象引用。它只是检查两个对象是否指向同一引用。

使用==来比较对象引用。它只是检查两个对象是否指向同一引用。

相等运算符(
=
)测试引用相等性而不是hashCode

public static void main(String[] args) {

    MyClass obj1=new MyClass();

    MyClass obj2=new MyClass();   //obj1 and obj2 refers two different location

    System.out.println("obj1= "+obj1+"\tobj2="+obj2);
    if(obj1==obj2){   // so return false.
        System.out.println("obj1==obj2");
    }else{
        System.out.println("obj1!=obj2");
    }

    System.out.println(obj1.hashCode()+"\t"+obj2.hashCode());

    }

class MyClass{}
输出:

obj1= com.think.test.MyClass@1e9cb75    obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189   obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
编辑

class EqualityTest {

     @Override
     public int hashCode(){ 
         return 1; 
     } 
     public static void main(String... arg){
         EqualityTest t1 = new EqualityTest(); 
         EqualityTest t2 =t1;  // t2 referring to t1.
         System.out.println(t1); 
         System.out.println(t2); 
         System.out.println(t1.hashCode());
         System.out.println(t2.hashCode()); 
         System.out.println(t1==t2);  // so it return true.
         } 
}
输出:

obj1= com.think.test.MyClass@1e9cb75    obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189   obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
相等运算符(
=
)测试引用相等性而不是
hashCode

public static void main(String[] args) {

    MyClass obj1=new MyClass();

    MyClass obj2=new MyClass();   //obj1 and obj2 refers two different location

    System.out.println("obj1= "+obj1+"\tobj2="+obj2);
    if(obj1==obj2){   // so return false.
        System.out.println("obj1==obj2");
    }else{
        System.out.println("obj1!=obj2");
    }

    System.out.println(obj1.hashCode()+"\t"+obj2.hashCode());

    }

class MyClass{}
输出:

obj1= com.think.test.MyClass@1e9cb75    obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189   obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
编辑

class EqualityTest {

     @Override
     public int hashCode(){ 
         return 1; 
     } 
     public static void main(String... arg){
         EqualityTest t1 = new EqualityTest(); 
         EqualityTest t2 =t1;  // t2 referring to t1.
         System.out.println(t1); 
         System.out.println(t2); 
         System.out.println(t1.hashCode());
         System.out.println(t2.hashCode()); 
         System.out.println(t1==t2);  // so it return true.
         } 
}
输出:

obj1= com.think.test.MyClass@1e9cb75    obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189   obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
相等运算符(
=
)测试引用相等性而不是
hashCode

public static void main(String[] args) {

    MyClass obj1=new MyClass();

    MyClass obj2=new MyClass();   //obj1 and obj2 refers two different location

    System.out.println("obj1= "+obj1+"\tobj2="+obj2);
    if(obj1==obj2){   // so return false.
        System.out.println("obj1==obj2");
    }else{
        System.out.println("obj1!=obj2");
    }

    System.out.println(obj1.hashCode()+"\t"+obj2.hashCode());

    }

class MyClass{}
输出:

obj1= com.think.test.MyClass@1e9cb75    obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189   obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
编辑

class EqualityTest {

     @Override
     public int hashCode(){ 
         return 1; 
     } 
     public static void main(String... arg){
         EqualityTest t1 = new EqualityTest(); 
         EqualityTest t2 =t1;  // t2 referring to t1.
         System.out.println(t1); 
         System.out.println(t2); 
         System.out.println(t1.hashCode());
         System.out.println(t2.hashCode()); 
         System.out.println(t1==t2);  // so it return true.
         } 
}
输出:

obj1= com.think.test.MyClass@1e9cb75    obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189   obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
相等运算符(
=
)测试引用相等性而不是
hashCode

public static void main(String[] args) {

    MyClass obj1=new MyClass();

    MyClass obj2=new MyClass();   //obj1 and obj2 refers two different location

    System.out.println("obj1= "+obj1+"\tobj2="+obj2);
    if(obj1==obj2){   // so return false.
        System.out.println("obj1==obj2");
    }else{
        System.out.println("obj1!=obj2");
    }

    System.out.println(obj1.hashCode()+"\t"+obj2.hashCode());

    }

class MyClass{}
输出:

obj1= com.think.test.MyClass@1e9cb75    obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189   obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
编辑

class EqualityTest {

     @Override
     public int hashCode(){ 
         return 1; 
     } 
     public static void main(String... arg){
         EqualityTest t1 = new EqualityTest(); 
         EqualityTest t2 =t1;  // t2 referring to t1.
         System.out.println(t1); 
         System.out.println(t2); 
         System.out.println(t1.hashCode());
         System.out.println(t2.hashCode()); 
         System.out.println(t1==t2);  // so it return true.
         } 
}
输出:

obj1= com.think.test.MyClass@1e9cb75    obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189   obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true

很容易看出JVM如何在字节码级别处理
==

比如说

public boolean compare(Object o1, Object o2)
{
     return o1 == o2;
}
编译为以下字节码指令(使用
javap-c
生成此指令):

aload1
aload2
在堆栈上加载o1和o2的参考。
=
操作由
if\u acmpne
执行

如果acmpne弹出堆栈顶部的两个对象引用,然后 比较它们如果两个对象引用不相等(即如果 它们指的是不同的对象),执行分支到。。。。如果对象 引用引用同一个对象,执行将在下一个 指示


当然,这并没有告诉您JVM解释器如何实现对象引用,或者像Hotspot这样的字节码到本机编译器如何实现它,但这是探索这个主题的一个良好开端。

很容易看到JVM如何在字节码级别处理
=

比如说

public boolean compare(Object o1, Object o2)
{
     return o1 == o2;
}
编译为以下字节码指令(使用
javap-c
生成此指令):

aload1
aload2
在堆栈上加载o1和o2的参考。
=
操作由
if\u acmpne
执行

如果acmpne弹出堆栈顶部的两个对象引用,然后 比较它们如果两个对象引用不相等(即如果 它们指的是不同的对象),执行分支到。。。。如果对象 引用引用同一个对象,执行将在下一个 指示


当然,这并没有告诉您JVM解释器如何实现对象引用,或者像Hotspot这样的字节码到本机编译器如何实现它,但这是探索这个主题的一个良好开端。

很容易看到JVM如何在字节码级别处理
=

比如说

public boolean compare(Object o1, Object o2)
{
     return o1 == o2;
}
编译为以下字节码指令(使用
javap-c
生成此指令):

aload1
aload2
在堆栈上加载o1和o2的参考。
=
操作由
if\u acmpne
执行

如果acmpne弹出顶部