java自動裝箱和拆箱

java自動裝箱和拆箱

基本數據類型,如int,float,double,boolean,char,byte,不具備對象的特徵,不能調用方法。
裝箱:將基本類型轉換成包裝類對象

int i=10;
Integer x=new Integer(i);手動裝箱
Integer y=10;自動裝箱

拆箱:將包裝類對象轉換成基本類型的值

Integer j=new Integer(8);
int m=j.intValue();//手動拆箱
int n=j;//自動拆箱 

java基本類型介紹

基本數據類型一共有8種,詳細信息如下表:
在這裏插入圖片描述
這八個和基本數據類型對應的類統稱爲包裝類(Wrapper Class)。

什麼是自動拆箱與自動裝箱

自動裝箱:把基本類型用它們對應的包裝類包裝起來,使它們具有對象的特質,可以調用所對應的包裝類所定義的方法,比如toString()等。
舉個例子:

   Integer i0 = new Integer(0);
   Integer i1 = 2;
   Integer i1_ = Integer.valueOf(2);

自動拆箱與自動裝箱的jdk1.5才引入的新特性,所以如果你的jdk版本低於1.5的話,是不可以這樣寫的。

爲什麼會有自動拆箱與自動裝箱

1.基礎數據類型和包裝類型相互轉換便捷
沒有自動拆箱與自動裝箱:

 Integer i = new Integer(2);//假如需要一個integer的對象i,值爲2
 int b=i.intValue();//需要一個int型的值,大小與i相等

有自動拆箱與裝箱:

Integer i = 2;
int b = i;

基礎數據類型和包裝類型相互轉換非常便捷。
2.自動裝箱的過程其實可以起到節約內存的作用。

Integer a = 1;
Integer b = 1;
Integer c = 144;
Integer d = 144;
Integer a1 = new Integer(1);
Integer b1 = new Integer(1);
System.out.println(a == b);         //true
System.out.println(a.equals(b));    //true
System.out.println(a1 == b1);       //false
System.out.println(a1.equals(b1));  //true
System.out.println(c == d);         //false
System.out.println(c.equals(d));    //true

第7行爲true而第12行爲false的原因是:
在自動裝箱時對於值從–128到127之間的值,它們被裝箱爲Integer對象後,會存在內存中被重用,始終只存在一個對象 。而如果超過了從**–128127之間的值,被裝箱後的Integer**對象並不會被重用,即相當於每次裝箱時都新建一個 Integer對象。

怎麼使用自動拆箱與自動裝箱

自動拆箱與裝箱實際上就是jvm幫我們去調用一些函數,這樣可以使我們的代碼更簡潔一些。但是下面這段代碼,編譯也可以正常通過,運行的時候會拋出空指針異常。

注意:在使用自動拆箱時,一定要確保包裝類的引用不爲空。

Integer a = null;
int b = a;

Integer源碼解析

valueOf()方法:

 public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

在自動裝箱時對於值從–128到127之間的值,它們被裝箱爲Integer對象後,會存在內存中被重用。現在明白是爲什麼了吧,在調用valueOf()方法的時候,會判斷你所給的數是不是在IntegerCache.low 和 i <= IntegerCache.high之間,如果是,那麼他就在內存中生成唯一的對象,當你第二次想要生成它的時候,他會把第一次所生成對象的地址給你,不會重新生成。而不在這個範圍裏的數,你每次所生成的對象都是不同的。

自動裝箱池的大小定義
Integer自動裝箱池的範圍是-128~127
Byte,Short,Long範圍是-128~127
Character範圍是0~127
Float和Double沒有自動裝箱池

總結

Java通過自動裝箱和拆箱的機制,節省了部分內存開銷和創建對象的開銷,提高了效率同時簡化了代碼。
在使用該機制的時候,需要注意以下幾點:
1.在進行==比較的時候,在自動裝箱池範圍內的數據的引用是相同的,範圍外的是不同的。
2。在自動拆箱時,要保證包裝類的引用不爲空。

發佈了50 篇原創文章 · 獲贊 24 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章