equals與==背後的裝箱拆箱機制
阿新 • • 發佈:2019-01-25
當談到”equals”和”==”的用法時,我們需要了解Java的資料型別
參考:裝箱和拆箱
先上個簡單的例子:
我們將編譯後的.class檔案反編譯:
因此可以用一句話總結裝箱和拆箱的實現過程:
裝箱過程是通過呼叫包裝器的valueOf方法實現的,
而拆箱過程是通過呼叫包裝器的 xxxValue方法實現的。(xxx代表對應的基本資料型別)。
再看個面試題了解一下:
乍一眼看有些懵。然後猜一下,就錯了。|–^–^-|
答案輸出:
true
false
輸出結果表明i1和i2指向的是同一個物件,而i3和i4指向的是不同的物件。
看一下Integer類的相關原始碼一探究竟:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
在通過valueOf方法建立Integer物件的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的物件的引用;否則建立一個新的Integer物件。
再說說"equals"和"=="
答案輸出:
false
true
false
false
值型別儲存在記憶體中的棧,引用型別變數儲存在棧中,
僅僅是儲存引用型別變數的地址,本身儲存在堆中
總的來說
“==”操作符比較兩個變數的值是否相等,引用型別變數儲存在堆中的地址是否相等,即棧中內容是否相等
equals比較的是兩個變數是否是同一個物件的引用,即堆中內容是否相同
"=="比較物件的地址,equals比較物件的內容