JDK 5.0版本引進了許多新的特性,其中包括了自動裝箱和自動拆箱。(auto-boxing & auto-unboxing)。java
咱們知道在Java中一共有8個基本類型,它們是boolean,byte,char,short,int.float,double,long,對應於這8種基本類型,JDk還提供了它們的包裝類(wrapper class),分別是Boolean,Byte,Character,Short,Integer,Float,Double,Long(只有char和int的包裝類有點變樣)。app
下面是自動裝箱的一個例子:ide
Integer year = 2013; // auto-boxing
這裏將值爲2013的int類型賦值給引用類型爲Integer的引用變量year。性能
實際上該語句等價於:url
- Integer year = Integer.valueOf(2013);
Integer year = Integer.valueOf(2013);
經過調用Integer的靜態方法valueOf將基本類型轉換成Integer引用類型。spa
下面是自動拆箱的一個例子:code
- Integer year = 2013;
- int iyear = year;
Integer year = 2013;
int iyear = year;
這裏將int的包裝類Integer賦值給int基本類型。對象
實際上該語句等價於:blog
- Integer year = Integer.valueOf(2013);
- int year = year.intValue();
Integer year = Integer.valueOf(2013);
int year = year.intValue();
經過調用實例對象的intValue方法將包裝類轉換成int基本類型。get
包裝類在邏輯運算中的應用。
1.比較兩個包裝類:
對於==和!=,比較的是它們的引用,而不是它們封裝的值。好比:
- Integer i = Integer.valueOf(2013);
- Integer j = Integer.valueOf(2013);
- if(i == j) {
- System.out.println("equals!");
- }
- else {
- System.out.println("Not equal!");
- }
Integer i = Integer.valueOf(2013);
Integer j = Integer.valueOf(2013);
if(i == j) {
System.out.println("equals!");
}
else {
System.out.println("Not equal!");
}
輸出結果是Not equal!。
對於>=,>,<,<=,比較的是它們攜帶的值。好比:
- Integer i = Integer.valueOf(2012);
- Integer j = Integer.valueOf(2013);
- String msg = i < j ? "lt" : (i == j) ? "eq" : "gt";
- System.out.println(msg);
Integer i = Integer.valueOf(2012);
Integer j = Integer.valueOf(2013);
String msg = i < j ? "lt" : (i == j) ? "eq" : "gt";
System.out.println(msg);
輸出結果是lt。
因此千萬不要用==或者!=對兩個包裝類進行比較(它們比較的是引用!!)
2.比較兩個混合類型(包裝類和對應基本類型比較):
對於==,!=,<,<=,>,>=,首先會對包裝類拆箱(調用實例對象的intValue方法),而後再來比較兩個基本類型。好比:
- Integer i = Integer.valueOf(2012);
- int j = 2013;
- String msg = (i >= j) ? "ge" : "lt";
- System.out.println(msg);
Integer i = Integer.valueOf(2012);
int j = 2013;
String msg = (i >= j) ? "ge" : "lt";
System.out.println(msg);
輸出結果是lt。
慎用裝箱基本類型(包裝類):考慮下面一個例子:
- Long sum = 0;
- for(int i=0; i< Integer.MAX_VALUE;i++) {
- sum += i;
- }
Long sum = 0;
for(int i=0; i< Integer.MAX_VALUE;i++) {
sum += i;
}
因爲粗枝大葉,將long寫成了Long。這樣在循環體中就會屢次拆箱和裝箱,形成性能影響。