【Java】22.常用API之lang.Integer包裝類之自動裝/拆箱

裝箱就是  自動將基本數據類型轉換爲包裝器類型;

拆箱就是  自動將包裝器類型轉換爲基本數據類型。

 

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));            // 運算自動提升
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章