java學(xué)習(xí)之理解自動拆裝箱特性
一、自動裝拆箱是什么?
- 有時,需要將int這樣的基本類型轉(zhuǎn)換為對象。所有的基本類型都有一個與之對應(yīng)的類,例如 Integer類對應(yīng)基本類型int。通常,這些類被稱為包裝器。
- 這些包裝類對應(yīng)基本數(shù)據(jù)類型:
Integer , Long , Float , Short , Byte, Charater , Boolen;
(前六個類派生于公共的超類Number) - 包裝類是不可變的,即一旦構(gòu)造了包裝器,就不允許更改包裝在其中的值,同時,包裝類還是final,因此不能派生他的子類。
二、拆裝箱的使用
1.引入包裝類的原因:
包裝成對象后更加方便操作,比如可以直接封裝一些方法放在類中方便使用:比如,將一個數(shù)字字符串s轉(zhuǎn)換成數(shù)值 可以使用:int x = Integer.parseInt(s)或者能方便將數(shù)據(jù)加入集合:假如想要定義一個整型數(shù)組列表。遺憾的是,尖括號中的類型參數(shù)不允許是基本類型,也就是說,不允許寫成如 ArrayList,這里就可以用到Integer 包裝類。
我們可以聲明一個Integer對象的數(shù)組列表:
ArrayList list = new ArrayList()
注:由于每個值分別包裝在對象中,所以ArrayList的執(zhí)行效率遠(yuǎn)低于int[ ]數(shù)組。因此,只有當(dāng)操作的方便性比執(zhí)行效率更重要時,才會考慮對較小的集合使用這種構(gòu)造
2.自動拆裝箱的運用
1.對于向ArrayList()中添加int類型的元素 就可以用到自動裝箱的特性,下面這個調(diào)用:
list.add(3);
將自動變換成:
list.add(Integer.valueOf(3));
這就是 自動裝箱(autoboxing)
2.相反的 當(dāng)將一個Integer對象賦給一個int值時,將會自動拆箱。也就是說,編譯器將以下語句:
int n=list.get(i);
轉(zhuǎn)換成:
int n =list.get(i).intValue();
這就是 自動拆箱
3.一些典型舉例
1.自動拆裝箱適用于算術(shù)表達(dá)式。例如,可以將自增運算符應(yīng)用于包裝類引用:
Integer n =1;
n++;
編譯器將自動插入一條對象拆箱的指令,然后進行自增運算,最后再將結(jié)果拆箱。
2.==運算符和包裝類聯(lián)用的注意
(以下內(nèi)容談到了 運行時常量池,如果需要搞清楚請移步這篇文章)
傳送門 運行時常量池理解
(1)自動裝箱常見的就是valueOf這個方法,自動拆箱就是intValue方法。在它們的源碼中有一段代碼定義了包裝類的緩沖區(qū)。除了兩個包裝類Long和Double 沒有實現(xiàn)這個緩存技術(shù),其它的包裝類均實現(xiàn)了它。
如下代碼:
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));
-----結(jié)果----
true
false
原理如下:
“==” 這個運算在不出現(xiàn)算數(shù)運算符的情況下 不會自動拆箱,所以i1 和 i 2它們不是數(shù)值進行的比較,仍然是比較地址是否指向同一塊內(nèi)存,在integer源碼中緩沖區(qū)的范圍是-128-127之間,在此范圍內(nèi)只要不new對象,那么數(shù)值的地址都是相同的,都在常量池區(qū)域。而Double沒有設(shè)置緩沖區(qū),自然i3 i4的地址不相同。
所以包裝類對象比較時最好調(diào)用equals方法。
3.(1)由于包裝類引用可以為NULL,所以自動裝箱有可能會拋出一個NullPointerException異常:
eg:Integer n =null; System.out.println(2*n);
(2)另外,如果在一個條件表達(dá)式中混合使用Integer和Double類型,Integer值會拆箱,提升為double再裝箱為Double;
引用--《java核心技術(shù)卷一》
以上就是java學(xué)習(xí)之理解自動拆裝箱特性的詳細(xì)內(nèi)容,更多關(guān)于java自動拆裝箱的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java將字符串轉(zhuǎn)化為數(shù)組的兩種方法
Java中的String類是一種特殊的字符串,它可以被用于處理字符串,Java中的String類也可以將字符串轉(zhuǎn)換為數(shù)組,下面這篇文章主要給大家介紹了關(guān)于Java將字符串轉(zhuǎn)化為數(shù)組的兩種方法,需要的朋友可以參考下2023-05-05
SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring Boot靜態(tài)資源路徑的配置與修改詳解
最近在做SpringBoot項目的時候遇到了“白頁”問題,通過查資料對SpringBoot訪問靜態(tài)資源做了總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
SpringSecurity實現(xiàn)動態(tài)url攔截(基于rbac模型)
本文主要介紹了SpringSecurity動態(tài)url攔截,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Java線程創(chuàng)建靜態(tài)代理模式代碼實例
這篇文章主要介紹了Java線程創(chuàng)建靜態(tài)代理模式代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11

