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對象後,會存在內存中被重用,始終只存在一個對象 。而如果超過了從**–128到127之間的值,被裝箱後的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。在自動拆箱時,要保證包裝類的引用不爲空。