最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java--裝箱和拆箱詳解

 更新時間:2021年07月19日 09:15:14   作者:吾仄lo咚鏘  
本篇文章主要介紹了詳解Java 自動裝箱與拆箱的實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

裝箱

八大基本類型都有一個與之對應(yīng)的類:

基本類型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

除了后兩個Character和Boolean類是Object派生類外,其余六個是繼承自Number類。

這些類稱為包裝器(wrapper),一旦構(gòu)造了對象包裝器,就不允許更改包裝器在其中的值同時,對象包裝器類還是final修飾,所以也不能定義繼承它們的子類。

有時候需要將基本類型轉(zhuǎn)換為對象,比如定義一個整數(shù)型列表,尖括號中的類型參數(shù)不允許是基本類型,即不允許寫成ArrayList<int>,這時就需要用到Integer包裝器類,可以聲明一個Integer對象的數(shù)組列表ArrayList<Integer>。

而且為了便于添加int類型的元素到ArrayList<Integer>中,下面語句會自動裝箱

list.add(8);

即自動地變換成:

list.add(Integer.valueof(8));

再比如Integer num=8;也是自動裝箱,會轉(zhuǎn)換成Integer num=Integer.valueOf(8);,即將基本類型賦值給相應(yīng)的類時,會觸發(fā)自動裝箱。

但是由于裝箱操作會創(chuàng)建對象,頻繁的裝箱操作會消耗許多內(nèi)存,影響性能,所以應(yīng)該盡量避免裝箱。

拆箱

同樣的,將類轉(zhuǎn)換為對應(yīng)的基本類型的過程就稱為拆箱,如上面的Integer類型變量num,int num2=num;就會觸發(fā)自動拆箱,自動地轉(zhuǎn)換為int num2=num.intValue();。

還有在算術(shù)表達式中也能夠自動地裝箱和拆箱,例如:

Integer n=6;
n++;
n-=2;

編譯器將自動地插入一條對象拆箱的指令,然后進行自增計算,最后再將結(jié)果裝箱。

注意裝箱和拆箱是編譯器認(rèn)可的,而不是虛擬機,編譯器在生成類的字節(jié)碼時,插入必要的方法調(diào)用,而虛擬機只是執(zhí)行這些字節(jié)碼。

使用數(shù)值對象包裝器可以將某些基本方法防止在包裝器中,例如parseInt()方法將一個數(shù)字字符串轉(zhuǎn)換成數(shù)值,parseInt()是一個靜態(tài)方法,與這里的Integer類對象沒有任何關(guān)系,只是Integer類是放置這個方法的一個好地方罷了。

而我們的拆箱裝箱無非是自動的調(diào)用了放置在類里面的方法如intValue()valueOf()等。

==

首先看看Integer.valueOf()函數(shù)的源碼,就知道==的坑了。

public static Integer valueOf(int i) {
	return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
	}

它會首先判斷 i i i的大?。喝绻?i > = 128 ∣ ∣ i < − 128 i>=128||i<-128 i>=128∣∣i<−128,就創(chuàng)建一個Integer對象,否則執(zhí)行SMALL_VALUES[i + 128],再定位到SMALL_VALUES:

private static final Integer[] SMALL_VALUES = new Integer[256];

它是一個已經(jīng)創(chuàng)建好的靜態(tài)的Integer數(shù)組對象,也就是說 i i i在 [ − 128 , 128 ) [-128,128) [−128,128)的范圍內(nèi)時,不會創(chuàng)建新的對象,否則會創(chuàng)建新的對象,這也就是裝箱為什么創(chuàng)建對象,從而消耗內(nèi)存。

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

比如以下==判斷:

    public static void main(String[] args) {
        Integer i1=88;
        Integer i2=88;
        Integer i3=666;
        Integer i4=666;
        System.out.println(i1==i2);//true
        System.out.println(i3==i4);//false
    }

==是判斷兩個對象的內(nèi)存地址是不是相等,顯然88在區(qū)間(-128,128)內(nèi),直接指向同一個創(chuàng)建好的數(shù)組,而666則會重新創(chuàng)建新對象。

同樣的boolean、byte、char<128;shot、int介于[-128,127]間時,會包裝到固定的對象中,比較結(jié)果一定成立,否則會創(chuàng)建新的對象,比較結(jié)果不成立。

這樣我們就能知道,混用時是自動拆箱還是自動裝箱了,如:

Integer n=666;
int m=666;
System.out.println(n==m);//true

如果是n自動拆箱,則指向常量池同一地址,則結(jié)果為true;如果是m自動裝箱,不在區(qū)間范圍內(nèi),創(chuàng)建新對象,則結(jié)果為false。答案是n自動拆箱。

再如:

Integer x=100;
int y=200;
Long z=300l;
System.out.println(x+y==z);//true
System.out.println(z.equals(x+y));//false

如果x、y、z自動拆箱則指向常量池同一地址,==結(jié)果true;如果x、y拆箱后裝箱成Long,不在區(qū)間范圍內(nèi),創(chuàng)建新對象,= =結(jié)果是false。答案是會拆箱。

那equals為什么輸出false?因為equals除了比較值相同外,還會比較數(shù)據(jù)類型,顯然兩者拆箱后分別是int和long型,故判斷為false。

null

由于包裝類的引用可以為null,所以自動裝箱時可能會拋出一個NullPointerException異常,如:

Integer n=null;
int m=n;

另外如果在一個條件表達式中混合使用Integer和Double類型,Integer值會拆箱,提升為Double,再裝箱為Double:

Integer n=6;
Double m=8.0;
System.out.println(true?n:m); //6.0

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Spring Security SecurityContextHolder組件示例說明

    Spring Security SecurityContextHolder組件示例說明

    SpringSecurity的SecurityContextHolder組件是存儲當(dāng)前安全上下文的地方,包括認(rèn)證用戶信息,它支持全局訪問、線程局部存儲和上下文傳播,是SpringSecurity認(rèn)證和授權(quán)的核心,文章通過示例展示了如何訪問已認(rèn)證用戶的詳細信息、手動設(shè)置認(rèn)證信息以及使用認(rèn)證信息保護方法
    2024-11-11
  • 深入學(xué)習(xí)Java編程中的字符串的進階使用

    深入學(xué)習(xí)Java編程中的字符串的進階使用

    這篇文章主要介紹了Java編程中的字符串的高級運用,包括StringBuffer類和StringTokenizer類以及常量池的介紹,需要的朋友可以參考下
    2016-01-01
  • JavaWeb Servlet生命周期細枝末節(jié)處深究

    JavaWeb Servlet生命周期細枝末節(jié)處深究

    Servlet指在服務(wù)器端執(zhí)行的一段Java代碼,可以接收用戶的請求和返回給用戶響應(yīng)結(jié)果,下面這篇文章主要給大家介紹了關(guān)于JavaWeb.servlet生命周期的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • SpringBoot部署與服務(wù)配置方式

    SpringBoot部署與服務(wù)配置方式

    這篇文章主要介紹了SpringBoot部署與服務(wù)配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • java集合框架的體系結(jié)構(gòu)詳細說明

    java集合框架的體系結(jié)構(gòu)詳細說明

    最近在一本J2EE的書中看到了很不錯的對集合框架的說明文章
    2012-11-11
  • 關(guān)于Java?中?Future?的?get?方法超時問題

    關(guān)于Java?中?Future?的?get?方法超時問題

    這篇文章主要介紹了Java?中?Future?的?get?方法超時,最常見的理解就是,“超時以后,當(dāng)前線程繼續(xù)執(zhí)行,線程池里的對應(yīng)線程中斷”,真的是這樣嗎?本文給大家詳細介紹,需要的朋友參考下吧
    2022-06-06
  • Spring Boot 與 Kotlin 使用Redis數(shù)據(jù)庫的配置方法

    Spring Boot 與 Kotlin 使用Redis數(shù)據(jù)庫的配置方法

    Redis是目前業(yè)界使用最廣泛的內(nèi)存數(shù)據(jù)存儲。下面通過本文給大家介紹Spring Boot 與 Kotlin 使用Redis數(shù)據(jù)庫的配置方法,感興趣的朋友一起看看吧
    2018-01-01
  • Java那點兒事之Map集合不為人知的秘密有哪些

    Java那點兒事之Map集合不為人知的秘密有哪些

    Map用于保存具有映射關(guān)系的數(shù)據(jù),Map集合里保存著兩組值,一組用于保存Map的key,另一組保存著Map的value,和查字典類似,通過key找到對應(yīng)的value,通過頁數(shù)找到對應(yīng)的信息。用學(xué)生類來說,key相當(dāng)于學(xué)號,value對應(yīng)name,age,sex等信息。用這種對應(yīng)關(guān)系方便查找
    2021-10-10
  • Spring JPA事務(wù)管理與自定義操作實例解析(最新推薦)

    Spring JPA事務(wù)管理與自定義操作實例解析(最新推薦)

    在Spring框架中,數(shù)據(jù)持久化操作常常與事務(wù)管理緊密相關(guān),本文將深入探討Spring Data JPA中的事務(wù)管理機制,并結(jié)合具體實例,展示如何自定義事務(wù)行為以滿足不同的業(yè)務(wù)需求,感興趣的朋友一起看看吧
    2024-12-12
  • java 對稱加密算法實現(xiàn)詳解

    java 對稱加密算法實現(xiàn)詳解

    這篇文章主要介紹了java 對稱加密算法實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07

最新評論

洛南县| 大安市| 阿坝县| 翁牛特旗| 德兴市| 内乡县| 翁源县| 卫辉市| 通化县| 甘泉县| 察隅县| 赤壁市| 花莲县| 抚州市| 滁州市| 沾益县| 客服| 枝江市| 澎湖县| 马鞍山市| 肃北| 鄂托克旗| 镇平县| 阳山县| 元阳县| 三门县| 新竹县| 宁蒗| 健康| 绍兴市| 永顺县| 信宜市| 遂平县| 上饶县| 瑞安市| 武强县| 西和县| 阿图什市| 柳林县| 囊谦县| 比如县|