[英]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
aload1
和aload2
在堆棧上加載 o1 和 o2 的引用。 ==
操作由if_acmpne
執行。
if_acmpne 從堆棧中彈出頂部的兩個對象引用並比較它們。 如果兩個對象引用不相等(即,如果它們引用不同的對象) ,則執行分支到...。如果對象引用引用相同的對象,則執行在下一條指令處繼續。
當然,這並沒有告訴您 JVM 解釋器如何實現對象引用,或者像 Hotspot 這樣的本機編譯器的字節碼如何實現它,但它是探索該主題的良好開端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.