一、什么是自動裝箱和拆箱:
我們知道java為8種基本類型分別提供了對應的包裝類型,在Java SE5之前,如果要生成一個數值為10的Integer對象,必須這樣進行:
Integer i=new Integer(10);
而在從Java SE5開始就提供了自動裝箱的特性,如果要生成一個數值為10的Integer對象,只需要這樣就可以了:
Integer i=10;
這個過程會自動根據數值的類型創建Integer對象,則就是自動裝箱,同理
Integer i=10; int j=i;
上面的代碼則是自動拆箱,將Integer對象自動拆箱為int
簡單來說裝箱就是自動將基本數據類型轉換為包裝器類型,拆箱就是自動將包裝器類型轉化為基本類型
二、裝箱和拆箱是如何實現的:
如下代碼:
public class Main { public static void main(String[] args) { Integer i = 10; int n = i; } }
反編譯后得到如下結果
由反編譯的結果可知,裝箱的時候調用的是Integer的valueOf方法,拆箱時調用的是Integer的intValue方法
其他的包裝器類也類似,這里就不一一舉例了
總結:java裝箱過程是調用包裝類的valueOf方法實現的,而拆箱過程則是調用包裝類的xxxValue方法實現的(xxx代表對應的基本類型)
三、面試中相關問題:
下面的這段代碼將輸出什么:
public class Main { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1==i2); System.out.println(i3==i4); } }
有人會答true,也有人會答false
正確答案是:

true false
結果顯示i1和i2指向同一個對象,i3和i4指向的是不同的對象