java學(xué)習(xí)之理解自動(dòng)拆裝箱特性
一、自動(dòng)裝拆箱是什么?
- 有時(shí),需要將int這樣的基本類型轉(zhuǎn)換為對(duì)象。所有的基本類型都有一個(gè)與之對(duì)應(yīng)的類,例如 Integer類對(duì)應(yīng)基本類型int。通常,這些類被稱為包裝器。
- 這些包裝類對(duì)應(yīng)基本數(shù)據(jù)類型:
Integer , Long , Float , Short , Byte, Charater , Boolen;
(前六個(gè)類派生于公共的超類Number) - 包裝類是不可變的,即一旦構(gòu)造了包裝器,就不允許更改包裝在其中的值,同時(shí),包裝類還是final,因此不能派生他的子類。
二、拆裝箱的使用
1.引入包裝類的原因:
包裝成對(duì)象后更加方便操作,比如可以直接封裝一些方法放在類中方便使用:比如,將一個(gè)數(shù)字字符串s轉(zhuǎn)換成數(shù)值 可以使用:int x = Integer.parseInt(s)或者能方便將數(shù)據(jù)加入集合:假如想要定義一個(gè)整型數(shù)組列表。遺憾的是,尖括號(hào)中的類型參數(shù)不允許是基本類型,也就是說(shuō),不允許寫成如 ArrayList,這里就可以用到Integer 包裝類。
我們可以聲明一個(gè)Integer對(duì)象的數(shù)組列表:
ArrayList list = new ArrayList()
注:由于每個(gè)值分別包裝在對(duì)象中,所以ArrayList的執(zhí)行效率遠(yuǎn)低于int[ ]數(shù)組。因此,只有當(dāng)操作的方便性比執(zhí)行效率更重要時(shí),才會(huì)考慮對(duì)較小的集合使用這種構(gòu)造
2.自動(dòng)拆裝箱的運(yùn)用
1.對(duì)于向ArrayList()中添加int類型的元素 就可以用到自動(dòng)裝箱的特性,下面這個(gè)調(diào)用:
list.add(3);
將自動(dòng)變換成:
list.add(Integer.valueOf(3));
這就是 自動(dòng)裝箱(autoboxing)
2.相反的 當(dāng)將一個(gè)Integer對(duì)象賦給一個(gè)int值時(shí),將會(huì)自動(dòng)拆箱。也就是說(shuō),編譯器將以下語(yǔ)句:
int n=list.get(i);
轉(zhuǎn)換成:
int n =list.get(i).intValue();
這就是 自動(dòng)拆箱
3.一些典型舉例
1.自動(dòng)拆裝箱適用于算術(shù)表達(dá)式。例如,可以將自增運(yùn)算符應(yīng)用于包裝類引用:
Integer n =1;
n++;
編譯器將自動(dòng)插入一條對(duì)象拆箱的指令,然后進(jìn)行自增運(yùn)算,最后再將結(jié)果拆箱。
2.==運(yùn)算符和包裝類聯(lián)用的注意
(以下內(nèi)容談到了 運(yùn)行時(shí)常量池,如果需要搞清楚請(qǐng)移步這篇文章)
(1)自動(dòng)裝箱常見的就是valueOf這個(gè)方法,自動(dòng)拆箱就是intValue方法。在它們的源碼中有一段代碼定義了包裝類的緩沖區(qū)。除了兩個(gè)包裝類Long和Double 沒有實(shí)現(xiàn)這個(gè)緩存技術(shù),其它的包裝類均實(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
原理如下:
“==” 這個(gè)運(yùn)算在不出現(xiàn)算數(shù)運(yùn)算符的情況下 不會(huì)自動(dòng)拆箱,所以i1 和 i 2它們不是數(shù)值進(jìn)行的比較,仍然是比較地址是否指向同一塊內(nèi)存,在integer源碼中緩沖區(qū)的范圍是-128-127之間,在此范圍內(nèi)只要不new對(duì)象,那么數(shù)值的地址都是相同的,都在常量池區(qū)域。而Double沒有設(shè)置緩沖區(qū),自然i3 i4的地址不相同。
所以包裝類對(duì)象比較時(shí)最好調(diào)用equals方法。
3.(1)由于包裝類引用可以為NULL,所以自動(dòng)裝箱有可能會(huì)拋出一個(gè)NullPointerException異常:
eg:Integer n =null; System.out.println(2*n);
(2)另外,如果在一個(gè)條件表達(dá)式中混合使用Integer和Double類型,Integer值會(huì)拆箱,提升為double再裝箱為Double;
引用--《java核心技術(shù)卷一》
以上就是java學(xué)習(xí)之理解自動(dòng)拆裝箱特性的詳細(xì)內(nèi)容,更多關(guān)于java自動(dòng)拆裝箱的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA中make directory as的作用及說(shuō)明
這篇文章主要介紹了IDEA中make directory as的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09詳解SpringCloud新一代網(wǎng)關(guān)Gateway
SpringCloud Gateway是Spring Cloud的一個(gè)全新項(xiàng)目,Spring 5.0+ Spring Boot 2.0和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式2021-06-06SpringBoot?+?proguard+maven多模塊實(shí)現(xiàn)代碼混淆的方法
這篇文章主要介紹了SpringBoot?+?proguard+maven多模塊實(shí)現(xiàn)代碼混淆的方法,多模塊跟單模塊一樣,在需要混淆模塊的pom文件中加入proguard依賴及配置,本文給大家講解的非常詳細(xì),感興趣的朋友一起看看吧2024-02-02SpringBoot項(xiàng)目中Controller接收兩個(gè)實(shí)體的實(shí)現(xiàn)方法
本文主要介紹了SpringBoot項(xiàng)目中Controller接收兩個(gè)實(shí)體的實(shí)現(xiàn)方法,主要介紹了兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08java中MultipartFile互轉(zhuǎn)File的方法
本文主要介紹了java中MultipartFile互轉(zhuǎn)File的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Java中float類型的范圍及其與十六進(jìn)制的轉(zhuǎn)換例子
這篇文章主要介紹了Java中float類型的范圍及其與十六進(jìn)制的轉(zhuǎn)換例子,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10java生成jar包并且單進(jìn)程運(yùn)行的實(shí)例
下面小編就為大家分享一篇java生成jar包并且單進(jìn)程運(yùn)行的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12MybatisPlus如何自定義TypeHandler映射JSON類型為L(zhǎng)ist
這篇文章主要介紹了MybatisPlus如何自定義TypeHandler映射JSON類型為L(zhǎng)ist,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01