文章目錄
- 一、自動裝拆箱是什么?
- 二、拆裝箱的使用
- 1.引入包裝類的原因:
- 2.自動拆裝箱的運用
- 3.一些典型舉例
一、自動裝拆箱是什么?
-
有時,需要將int這樣的基本型別轉換為物件,所有的基本型別都有一個與之對應的類,例如 Integer類對應基本型別int,通常,這些類被稱為包裝器,
-
這些包裝類對應基本資料型別:
Integer , Long , Float , Short , Byte, Charater , Boolen;
(前六個類派生于公共的超類Number) -
包裝類是不可變的,即一旦構造了包裝器,就不允許更改包裝在其中的值,同時,包裝類還是final,因此不能派生他的子類,
二、拆裝箱的使用
1.引入包裝類的原因:
- 包裝成物件后更加方便操作,比如可以直接封裝一些方法放在類中方便使用:比如,將一個數字字串s轉換成數值 可以使用:int x = Integer.parseInt(s)
- 或者能方便將資料加入集合:假如想要定義一個整型陣列串列,遺憾的是,尖括號中的型別引數不允許是基本型別,也就是說,不允許寫成如 ArrayList,這里就可以用到Integer 包裝類,
我們可以宣告一個Integer物件的陣列串列:
ArrayList list = new ArrayList()
注:由于每個值分別包裝在物件中,所以ArrayList的執行效率遠低于int[ ]陣列,因此,只有當操作的方便性比執行效率更重要時,才會考慮對較小的集合使用這種構造
2.自動拆裝箱的運用
- 對于向ArrayList()中添加int型別的元素 就可以用到自動裝箱的特性,下面這個呼叫:
list.add(3);
將自動變換成:
list.add(Integer.valueOf(3));
這就是 自動裝箱(autoboxing) - 相反的 當將一個Integer物件賦給一個int值時,將會自動拆箱,也就是說,編譯器將以下陳述句:
int n=list.get(i);
轉換成:
int n =list.get(i).intValue();
這就是 自動拆箱
3.一些典型舉例
- 自動拆裝箱適用于算術運算式,例如,可以將自增運算子應用于包裝類參考:
Integer n =1;
n++;
編譯器將自動插入一條物件拆箱的指令,然后進行自增運算,最后再將結果拆箱, - ==運算子和包裝類聯用的注意
(以下內容談到了 運行時常量池,如果需要搞清楚請移步這篇文章)
(1)自動裝箱常見的就是valueOf這個方法,自動拆箱就是intValue方法,在它們的原始碼中有一段代碼定義了包裝類的緩沖區,除了兩個包裝類Long和Double 沒有實作這個快取技術,其它的包裝類均實作了它,
如下代碼:
Integer i1 = 40;
Integer i2 = 40;
Double i3 = 40.0;
Double i4 = 40.0;
System.out.println("i1=i2 " + (i1 == i2));
System.out.println("i3=i4 " + (i3 == i4));
-----結果----
true
false
原理如下:
“==” 這個運算在不出現算數運算子的情況下 不會自動拆箱,所以i1 和 i 2它們不是數值進行的比較,仍然是比較地址是否指向同一塊記憶體,在integer原始碼中緩沖區的范圍是-128-127之間,在此范圍內只要不new物件,那么數值的地址都是相同的,都在常量池區域,而Double沒有設定緩沖區,自然i3 i4的地址不相同,
所以包裝類物件比較時最好呼叫equals方法,
-
(1)由于包裝類參考可以為NULL,所以自動裝箱有可能會拋出一個NullPointerException例外:
eg:Integer n =null; System.out.println(2*n);
(2)另外,如果在一個條件運算式中混合使用Integer和Double型別,Integer值會拆箱,提升為double再裝箱為Double;參考--《java核心技術卷一》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/300231.html
標籤:java
下一篇:cgb2107-day15
