簡體   English   中英

什么 JVM 檢查 Java 對象相等性 (==)?

[英]What JVM checks in Java object equality (==)?

JVM 在對象相等性 ( == ) 中檢查什么? 是兩個對象的hashCode還是別的?

==運算符檢查引用相等性。 它不調用對象上的任何方法...它只是檢查涉及的兩個引用是否相等,即它們引用同一個對象。

在簡單的情況下,我相信這只是按位方式比較引用的問題——檢查它們是否由相同的字節組成。 對於更復雜的環境(例如“壓縮的 oops” ),可能會涉及更多的工作,以便比較不同的表示。 但內部引用實際上是某種指針,只是比較兩個指針的問題。

== 用於比較對象引用。 它只是檢查兩個對象是否指向同一個引用。

相等運算符 ( == ) 測試引用相等性而不是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

編輯

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.
         } 
}

輸出:

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生成):

public boolean compare(java.lang.Object, java.lang.Object);
  Code:
    0: aload_1
    1: aload_2
    2: if_acmpne     7
    5: iconst_1
    6: ireturn
    7: iconst_0
    8: ireturn

aload1aload2在堆棧上加載 o1 和 o2 的引用。 ==操作由if_acmpne執行。

if_acmpne 從堆棧中彈出頂部的兩個對象引用並比較它們。 如果兩個對象引用不相等(即,如果它們引用不同的對象) ,則執行分支到...。如果對象引用引用相同的對象,則執行在下一條指令處繼續。

當然,這並沒有告訴您 JVM 解釋器如何實現對象引用,或者像 Hotspot 這樣的本機編譯器的字節碼如何實現它,但它是探索該主題的良好開端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM