更新時間:2020-09-10 16:30:55 來源:動力節點 瀏覽2764次
一.什么是裝箱?什么是拆箱?
Java為每種基本數據類型都提供了對應的包裝器類型,至于為什么會為每種基本數據類型提供包裝器類型在此不進行闡述,有興趣的朋友可以查閱相關資料。在Java SE5之前,如果要生成一個數值為10的Integer對象,必須這樣進行:
Integer i = new Integer(10);
而在從Java SE5開始就提供了自動裝箱的特性,如果要生成一個數值為10的Integer對象,只需要這樣就可以了:
Integer i = 10;
這個過程中會自動根據數值創建對應的Integer對象,這就是裝箱。
那什么是拆箱呢?顧名思義,跟裝箱對應,就是自動將包裝器類型轉換為基本數據類型:
Integer?i?=?10;?//裝箱
int?n?=?i;?//拆箱
簡單一點說,裝箱就是 自動將基本數據類型轉換為包裝器類型;拆箱就是 自動將包裝器類型轉換為基本數據類型。
下表是基本數據類型對應的包裝器類型:
裝箱和拆箱是如何實現?
如下代碼理解一下:
public?class?Main?{
public?static?void?main(String[]?args)?{
Integer?total?=?99;?//自動裝箱
int?totalprim?=?total;?//自定拆箱
}
}
反編譯class文件之后得到如下內容:
Integer total=99;執行上面那句代碼的時候,系統為我們執行了:Integer total=Integer.valueOf(99);
int totalprim=total;執行上面那句代碼的時候,系統為我們執行了:int totalprim=total.intValue();
也就是在裝箱的時候自動調用的是Integer的valueOf(int)方法。而在拆箱的時候自動調用的是Integer的intValue方法。
其他的也類似,比如Double、Character。
因此可以用一句話總結裝箱和拆箱的實現過程:
裝箱過程是通過調用包裝器的valueOf方法實現的,而拆箱過程是通過調用包裝器的xxxValue方法實現的。(xxx代表對應的基本數據類型)。
java 語句 Integer i = 1; i += 1; 做了哪些事情?
首先Integer i=1;做了自動裝箱(使用valueOf()方法將int裝箱為Integer類型),接著i+=1;先將Integer類型的i自動拆箱成int(使用intValue()方法將Integer拆箱為int),完成加法運行之后的i再裝箱成Integer類型。
下面程序的運行結果是什么?
答:答案如上注釋所述,通過查看Integer的源碼可以發現,針對-128到127之間的數據做了一個數據緩沖池,如果數據是該范圍內的,每次并不創建新的對象,所以就有了上面的結果。
下面語句能正常執行嗎?
Integer?test1?=?(Integer)?null;
Double?test2?=?(Double)?null;Boolean?test3?=?(Boolean)?null;
答:上面語句可以正常執行。因為在 java 中 null 既不是對象也不是一種類型,它僅是一種特殊的值,我們可以將其賦予任何引用類型,也可以將 null 轉化成任何類型。
下面這段代碼的輸出結果是什么?
public?class?Main?{
public?static?void?main(String[]?args)?{
Double?i1?=?100.0;
Double?i2?=?100.0;
Double?i3?=?200.0;
Double?i4?=?200.0;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
實際輸出結果為:
false
false
具體為什么,大家可以去查看Double類的valueOf的實現。
在這里只解釋一下為什么Double類的valueOf方法會采用與Integer類的valueOf方法不同的實現。很簡單:在某個范圍內的整型數值的個數是有限的,而浮點數卻不是。
注意,Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實現是類似的。
Double、Float的valueOf方法的實現是類似的。
以上就是動力節點java培訓機構的小編針對“Java裝箱與拆箱相關面試題”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習