裝箱和拆箱的區別與詳解
深入剖析Java中的裝箱和拆箱
自動裝箱和拆箱問題是Java中一個老生常談的問題了,今天我們就來一些看一下裝箱和拆箱中的若干問題。本文先講述裝箱和拆箱最基本的東西,再來看一下面試筆試中經常遇到的與裝箱、拆箱相關的問題。
以下是本文的目錄大綱:
一.什麼是裝箱?什麼是拆箱?
二.裝箱和拆箱是如何實現的
三.面試中相關的問題
若有不正之處,請諒解和批評指正,不勝感激。
請尊重作者勞動成果,轉載請標明原文連結:
一.什麼是裝箱?什麼是拆箱?
在前面的文章中提到,Java為每種基本資料型別都提供了對應的包裝器型別,至於為什麼會為每種基本資料型別提供包裝器型別在此不進行闡述,有興趣的朋友可以查閱相關資料。在Java SE5之前,如果要生成一個數值為10的Integer物件,必須這樣進行:
1 |
Integer
i = new Integer( 10 );
|
而在從Java SE5開始就提供了自動裝箱的特性,如果要生成一個數值為10的Integer物件,只需要這樣就可以了:
1 |
Integer
i = 10 ;
|
這個過程中會自動根據數值建立對應的 Integer物件,這就是裝箱。
那什麼是拆箱呢?顧名思義,跟裝箱對應,就是自動將包裝器型別轉換為基本資料型別:
1 2 |
Integer
i = 10 ; //裝箱
int n
= i; //拆箱
|
簡單一點說,裝箱就是 自動將基本資料型別轉換為包裝器型別;拆箱就是 自動將包裝器型別轉換為基本資料型別。
下表是基本資料型別對應的包裝器型別:
int(4位元組) | Integer |
byte(1位元組) | Byte |
short(2位元組) | Short |
long(8位元組) | Long |
float(4位元組) | Float |
double(8位元組) |
Double |
char(2位元組) | Character |
boolean(未定) | Boolean |
二.裝箱和拆箱是如何實現的
上一小節瞭解裝箱的基本概念之後,這一小節來了解一下裝箱和拆箱是如何實現的。
我們就以Interger類為例,下面看一段程式碼:
1 2 3 4 5 6 7 |
public class Main
{
public static void main(String[]
args) {
Integer
i = 10 ;
int n
= i;
}
}
|
反編譯class檔案之後得到如下內容:
從反編譯得到的位元組碼內容可以看出,在裝箱的時候自動呼叫的是Integer的valueOf(int)方法。而在拆箱的時候自動呼叫的是Integer的intValue方法。
其他的也類似,比如Double、Character,不相信的朋友可以自己手動嘗試一下。
因此可以用一句話總結裝箱和拆箱的實現過程:
裝箱過程是通過呼叫包裝器的valueOf方法實現的,而拆箱過程是通過呼叫包裝器的 xxxValue方法實現的。(xxx代表對應的基本資料型別)。
三.面試中相關的問題
雖然大多數人對裝箱和拆箱的概念都清楚,但是在面試和筆試中遇到了與裝箱和拆箱的問題卻不一定會答得上來。下面列舉一些常見的與裝箱/拆箱有關的面試題。
1.下面這段程式碼的輸出結果是什麼?
1 2 3 4 5 6 7 8 9 10 11 12 |
|