Java自動裝箱與自動拆箱_2019-09-11

Java的基本數據類型及他們的包裝類型

說到裝箱和拆箱,我想大家首先想到的應該是Java中的8中基本數據類型以及它們對應的包裝類型。它們對應關係如下:

基本數據類型 包裝類型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

爲什麼需要包裝類型

因爲萬物皆對象…。但是更深層次的原因是因爲我們無法將基本數據類型作爲泛型,比如你不能這麼定義:

List<int> list = new ArrayList();

所以需要有這麼個包裝類將基本數據類型包裝起來,可以將它當作普通的對象來使用。

什麼是拆箱和裝箱

既然有了基本數據類型和他們對應的包裝類型,那麼他們在某些程度上是同一種東西,所以有很多情況下他們會互相轉化。
裝箱:基本數據類型----->包裝類型
拆箱:包裝類型----->基本數據類型
用代碼來講的話就是

int i = 1;
Integer a = new Integer(i);//裝箱
int b = a.intValue();//拆箱

但其實上面這段代碼看起來很怪,因爲很多時候我們感覺基本數據類型和對應的包裝類時同一種東西,而我們在使用的時候要手動進行裝箱和拆箱,感覺非常的繁瑣,不夠優雅。巧了,Java的設計人員也是這麼想的,於是就有了自動裝箱和自動裝箱,如下:

Integer integer = 5;//自動裝箱
int i = integer ;//自動拆箱

頓時感覺代碼簡潔了有木有!!!其實是裝箱與拆箱的動作放到了編譯環節,這是Java SE5帶來的變化之一。

注意事項

在使用包裝類的時候,需要注意以下兩點:

數值的比較

對兩個包裝類進行數值比較時,如果使用==進行比較,可能會因爲包裝類自身的緩存問題導致意想不到的結果,比如

Integer a = 66;
Integer b = 66;
System.out.println(a == b);//true
Integer c = 666;
Integer d = 666;
System.out.println(c == d);//false

自動拆箱時可能會有NPE

包裝類爲對象,也就是說可以爲null,所以在自動拆箱的時候可能拆箱失敗,報NPE。

public class AutomaticUnpackingTest{
    public static void main(String []args) {
       	Integer i = null;
        int a = i;//Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:4)
    }
}

所以在自動拆箱的時候記得將判斷賦予默認值:

import java.util.Optional;////請在jdk1.8後食用

public class HelloWorld {
    public static void main(String []args) {
       	Integer integer = null;
        //a = integer;
        int b = integer == null ? 0 : i;//b = 0
        int c = Optional.ofNullable(integer).orElse(0);//c = 0;請在jdk1.8後食用
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章