1. 程式人生 > >equals與==背後的裝箱拆箱機制

equals與==背後的裝箱拆箱機制

當談到”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比較物件的內容