裝箱就是 自動將基本數據類型轉換爲包裝器類型;
拆箱就是 自動將包裝器類型轉換爲基本數據類型。
J2SE 5以後支持自動裝箱(Autoboxing)、拆箱(Unboxing)。
如:自動裝箱Integer a=10; 可以直接使用,運行時會參考Integer的實例。
自動拆箱:int b = a; 自動取得打包的int類型再指定給b。
運算也可以自動裝箱、拆箱。int類型和Integer類型可以相互運算。
自動裝箱與拆箱的實質是編譯程序蜜糖(Compiler Sugar),也就是說寫的方便,編譯的時候會將程序代碼展開。
※ 自動裝箱實際方法代碼 valueOf(),即通過包裝器調用valueOf()方法
如Integer num=100;通過反編譯程序比如JD、JAD可以看到編譯程序會展開爲,Integer localInteger = Integer.valueOf(100);
如果不需要創建新的integer實例,則可以使用該方法優先於構造函數;原因在於該方法可能通過緩存(Cache)經常請求的值而產生明顯更好的空間和時間性能,此方法將始終緩存IntegerCache.low(-128)與IntegerCache.high(含127)範圍內的值,如果是在緩存內的值裝箱所對應的包裝類將是同一實例。
但如果是浮點數的實現過程則不同(在某個範圍內的整型數值的個數是有限的,而浮點數卻不是。)
Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實現是類似的。
Double、Float的valueOf方法的實現是類似的。
※ 自動拆箱實際方法代碼 intValue(),即通過包裝器調用intValue()方法
創建了一個空對象,然後進行設值。Object localObject=null;int i=localObject.intValue();
例題
public class Main {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c==d); // 緩存範圍內
System.out.println(e==f); // 緩存範圍外
System.out.println(c==(a+b)); // 有表達式或算術運算則比較值
System.out.println(c.equals(a+b)); // equals沒有重寫即比較對象
System.out.println(g==(a+b)); // 有表達式或算術運算則比較值
System.out.println(g.equals(a+b)); // equals不會類型轉換
System.out.println(g.equals(a+h)); // 運算自動提升
}
}