Java-基本類型優先於裝箱基本類型

 

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

Java代碼 複製代碼  收藏代碼
  1. Integer year = 2013;  // auto-boxing  

 

這裏將值爲2013的int類型賦值給引用類型爲Integer的引用變量year。性能

實際上該語句等價於:url

Java代碼 複製代碼  收藏代碼
  1. Integer year = Integer.valueOf(2013);  

 

 經過調用Integer的靜態方法valueOf將基本類型轉換成Integer引用類型。spa

 

下面是自動拆箱的一個例子:code

Java代碼 複製代碼  收藏代碼
  1. Integer year = 2013;   
  2. int iyear = year;  

 

 這裏將int的包裝類Integer賦值給int基本類型。對象

實際上該語句等價於:blog

Java代碼 複製代碼  收藏代碼
  1. Integer year = Integer.valueOf(2013);   
  2. int year = year.intValue();  

 

 經過調用實例對象的intValue方法將包裝類轉換成int基本類型。get

 

包裝類在邏輯運算中的應用。

1.比較兩個包裝類:

對於==和!=,比較的是它們的引用,而不是它們封裝的值。好比:

Java代碼 複製代碼  收藏代碼
  1. Integer i = Integer.valueOf(2013);   
  2. Integer j = Integer.valueOf(2013);   
  3. if(i == j) {   
  4.     System.out.println("equals!");   
  5. }   
  6. else {   
  7.     System.out.println("Not equal!");   
  8. }  

 

 輸出結果是Not equal!。

對於>=,>,<,<=,比較的是它們攜帶的值。好比:

Java代碼 複製代碼  收藏代碼
  1. Integer i = Integer.valueOf(2012);   
  2. Integer j = Integer.valueOf(2013);   
  3. String msg = i < j ? "lt" : (i == j) ? "eq" : "gt";   
  4. System.out.println(msg);  

 

 輸出結果是lt。

因此千萬不要用==或者!=對兩個包裝類進行比較(它們比較的是引用!!)

 

2.比較兩個混合類型(包裝類和對應基本類型比較):

對於==,!=,<,<=,>,>=,首先會對包裝類拆箱(調用實例對象的intValue方法),而後再來比較兩個基本類型。好比:

Java代碼 複製代碼  收藏代碼
  1. Integer i = Integer.valueOf(2012);   
  2. int j = 2013;   
  3. String msg = (i >= j) ? "ge" : "lt";   
  4. System.out.println(msg);  

 

 輸出結果是lt。

 

慎用裝箱基本類型(包裝類):考慮下面一個例子:

Java代碼 複製代碼  收藏代碼
  1. Long sum = 0;   
  2. for(int i=0; i< Integer.MAX_VALUE;i++) {   
  3.     sum += i;   
  4. }  

 

 因爲粗枝大葉,將long寫成了Long。這樣在循環體中就會屢次拆箱和裝箱,形成性能影響。

相關文章
相關標籤/搜索