java裝箱拆箱

劍握在手發表於2013-11-11

基本資料型別的自動裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開始提供的功能。 

一般我們要建立一個類的物件的時候,我們會這樣:

 Class a = new Class(parameter);

 

裝箱:

 當我們建立一個Integer物件時,卻可以這樣:

 Integer i = 100; (注意:不是 int i = 100; )

Integer i = 100實際上是 Integer i = Integer.valueOf(100);此即基本資料型別的自動裝箱功能。

 

PS:當 Integer i = XX XX不在valueOf的範圍(-128~127)內時,Integer i = XX歸根結底就是Integer i = new Integer(XX)

 

拆箱:

Integer i = new Integer(333);

int j = i;//自動取出其值

 

InvalueOf原始碼如下:

public static Integer valueOf(int i) {
 final int offset = 128;
 if (i >= -128 && i <= 127) { // must cache
     return IntegerCache.cache[i + offset];
 }
        return new Integer(i);
 }

當方法的引數小於等於127和大約等於-128時,會始終只在記憶體中存在一個相同數值的物件,

Integer i = 100;

Integer j = 100;

i和j指會向同一個物件。

不明白的可以再去看看Integer中的私有類IntegerCache,第一次初始化的時候它就會造出來256個物件。

 

 

裝箱和拆箱的例子,從基本型別對應的類到Object的轉換,也是裝箱和拆箱的一個用法:

 

class fu{
 int i=1111;
}

class zi extends fu{
 int j =2222;
}

public class Test {

 /**
  * @param args
  */
 public static void main(String args[]) {
  Integer a=new Integer(333);
  m31(a);
  zhuangxiangTest(new zi());
  
  Integer c = new Integer(128);
  Object s = c;
  Integer x = (Integer) s;//這一句是為了試一下Integer x = s;會不會“拆箱”,結果證明同其它的父子繼承一樣,不轉換型別會報錯
  System.out.println(s);
 }

 public static void m31(Object i) {
  System.out.println(i.getClass());//這裡不需要轉換,自動就轉換了
 }
 
 public static void zhuangxiangTest(fu x) {
  zi i = (zi)x;//多一步轉換否則下面這句是行不通的
  System.out.println(i.j);
 }
}

 

 

 

另外:

String str = "a"也是裝箱,應該相當於String str = "a".intern();

intern是一個本地方法,它會去記憶體中檢查是否有這個常量。

相關文章