天天看點

詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我

詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我

簡單一點說,裝箱就是自動将基本資料類型轉換為包裝器類型;拆箱就是自動将包裝器類型轉換為基本資料類型。

下面我們來看看需要裝箱拆箱的類型有哪些:

詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我

這個過程是自動執行的,那麼我們需要看看它的執行過程:

反編譯

class 檔案之後得到如下内容:

1 javap -c StringTest

詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我

Integer total = 99;

執行上面那句代碼的時候,系統為我們執行了:

Integer total = Integer.valueOf(99);

int totalprim = total;

int totalprim = total.intValue();

我們現在就以 Integer 為例,來分析一下它的源碼:

1、首先來看看 Integer.valueOf 函數

詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我
詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我
詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我

代碼的後面,我們可以看到它們的執行結果是不一樣的,為什麼,在看看我們上面的說明。

1、i1和i2會進行自動裝箱,執行了valueOf函數,它們的值在(-128,128]這個範圍内,它們會拿到 SMALL_VALUES數組裡面的同一個對象 SMALL_VALUES[228],它們引用到了同一個 Integer 對象,是以它們肯定是相等的。

2、i3 和 i4 也會進行自動裝箱,執行了 valueOf 函數,它們的值大于 128,是以會執行 new Integer(200),也就是說它們會分别建立兩個不同的對象,是以它們肯定不等。

下面我們來看看另外一個例子:

詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我

看看上面的執行結果,跟 Integer 不一樣,這樣也不必奇怪,因為它們的 valueOf 實作不一樣,結果肯定不一樣,那為什麼它們不統一一下呢?

這個很好了解,因為對于 Integer,在(-128,128]之間隻有固定的 256 個值,是以為了避免多次建立對象,我們事先就建立好一個大小為 256 的 Integer 數組SMALL_VALUES,是以如果值在這個範圍内,就可以直接傳回我們事先建立好的對象就可以了。

但是對于 Double 類型來說,我們就不能這樣做,因為它在這個範圍内個數是無限的。 總結一句就是:在某個範圍内的整型數值的個數是有限的,而浮點數卻不是。

是以在 Double 裡面的做法很直接,就是直接建立一個對象,是以每次建立的對象都不一樣。

詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我
詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我
詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我
詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我
詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我
詳解 Java 中的自動裝箱與拆箱,5000+字,看了不懂你打我

總結

1、需要知道什麼時候會引發裝箱和拆箱

2、裝箱操作會建立對象,頻繁的裝箱操作會消耗許多記憶體,影響性能,是以可以避免裝箱的時候應該盡量避免。

3、equals(Object o) 因為原equals方法中的參數類型是封裝類型,所傳入的參數類型(a)是原始資料類型,是以會自動對其裝箱,反之,會對其進行拆箱

4、當兩種不同類型用 == 比較時,包裝器類的需要拆箱, 當同種類型用==比較時,會自動拆箱或者裝箱

來源:

https://www.cnblogs.com/wang-yaz/p/8516151.html