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後食用
}
}