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í)行效率遠低于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ù)表達式。例如,可以將自增運算符應(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)另外,如果在一個條件表達式中混合使用Integer和Double類型,Integer值會拆箱,提升為double再裝箱為Double;
引用--《java核心技術(shù)卷一》
以上就是java學(xué)習(xí)之理解自動拆裝箱特性的詳細內(nèi)容,更多關(guān)于java自動拆裝箱的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解SpringCloud新一代網(wǎng)關(guān)Gateway
SpringCloud Gateway是Spring Cloud的一個全新項目,Spring 5.0+ Spring Boot 2.0和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的API路由管理方式2021-06-06SpringBoot?+?proguard+maven多模塊實現(xiàn)代碼混淆的方法
這篇文章主要介紹了SpringBoot?+?proguard+maven多模塊實現(xiàn)代碼混淆的方法,多模塊跟單模塊一樣,在需要混淆模塊的pom文件中加入proguard依賴及配置,本文給大家講解的非常詳細,感興趣的朋友一起看看吧2024-02-02SpringBoot項目中Controller接收兩個實體的實現(xiàn)方法
本文主要介紹了SpringBoot項目中Controller接收兩個實體的實現(xiàn)方法,主要介紹了兩種方法,具有一定的參考價值,感興趣的可以了解一下2023-08-08java中MultipartFile互轉(zhuǎn)File的方法
本文主要介紹了java中MultipartFile互轉(zhuǎn)File的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10Java中float類型的范圍及其與十六進制的轉(zhuǎn)換例子
這篇文章主要介紹了Java中float類型的范圍及其與十六進制的轉(zhuǎn)換例子,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10MybatisPlus如何自定義TypeHandler映射JSON類型為List
這篇文章主要介紹了MybatisPlus如何自定義TypeHandler映射JSON類型為List,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01