一、什么是裝箱和拆箱
JAVA中基本數(shù)據(jù)類型與它們的包裝類進(jìn)行運(yùn)算時,編譯器會自動幫我們進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換過程是透明的。其中,裝箱就是自動將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝器類型;拆箱就是自動將包裝器類型轉(zhuǎn)換為基本數(shù)據(jù)類型。
基本數(shù)據(jù)類型:int(4字節(jié))、byte(1字節(jié))、short(2字節(jié))、long(8字節(jié))、float(4字節(jié))、double(8字節(jié))、char(2字節(jié))、boolean(未定)
對應(yīng)包裝類型:Integer、Byte、Short、Long、Float、Double、Char、Boolean
一個簡單例子:
二、裝箱和拆箱的實(shí)現(xiàn)過程
通過javap命令對上例反編譯得到如下圖所示字節(jié)碼內(nèi)容:
由上圖可知,在裝箱的時候自動調(diào)用的是Integer的valueOf(int)方法,在拆箱的時候自動調(diào)用的是Integer的intValue方法。
事實(shí)上,裝箱過程就是通過調(diào)用包裝器的valueOf方法實(shí)現(xiàn),而拆箱過程是通過調(diào)用包裝器的 xxxValue方法實(shí)現(xiàn)。(xxx代表對應(yīng)的基本數(shù)據(jù)類型)
三、一道面試題
下面代碼塊的輸出結(jié)果是什么?
答案是:
true
false
原因分析:i1,i2,i3和i4都進(jìn)行了自動裝箱,也即執(zhí)行了valueOf函數(shù),函數(shù)源碼(jdk1.8.0_111)如下:
其中,IntegerCache的實(shí)現(xiàn)如下:
從源碼可知,如果數(shù)值在[-128,127]之間,則返回IntegerCache.cache中已經(jīng)存在的對象的引用,否則創(chuàng)建一個新的Integer對象。而100在[-128,127]之間,200在該范圍之外,故i1和i2指定同一對象,而i3和i4指定不同對象。
對于其他類型的自動裝箱分析可參考以上思路,結(jié)果可能會因?yàn)関alueOf的具體實(shí)現(xiàn)而不同。