亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java--裝箱和拆箱詳解

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

裝箱

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

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

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

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

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

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

list.add(8);

即自動(dòng)地變換成:

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

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

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

拆箱

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

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

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

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

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

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

而我們的拆箱裝箱無非是自動(dòng)的調(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];
	}

它會(huì)首先判斷 i i i的大小:如果 i > = 128 ∣ ∣ i < − 128 i>=128||i<-128 i>=128∣∣i<−128,就創(chuàng)建一個(gè)Integer對(duì)象,否則執(zhí)行SMALL_VALUES[i + 128],再定位到SMALL_VALUES:

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

它是一個(gè)已經(jīng)創(chuàng)建好的靜態(tài)的Integer數(shù)組對(duì)象,也就是說 i i i在 [ − 128 , 128 ) [-128,128) [−128,128)的范圍內(nèi)時(shí),不會(huì)創(chuàng)建新的對(duì)象,否則會(huì)創(chuàng)建新的對(duì)象,這也就是裝箱為什么創(chuàng)建對(duì)象,從而消耗內(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
    }

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

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

這樣我們就能知道,混用時(shí)是自動(dòng)拆箱還是自動(dòng)裝箱了,如:

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

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

再如:

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

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

null

由于包裝類的引用可以為null,所以自動(dòng)裝箱時(shí)可能會(huì)拋出一個(gè)NullPointerException異常,如:

Integer n=null;
int m=n;

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

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

總結(jié)

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

相關(guān)文章

  • Java使用Redisson分布式鎖實(shí)現(xiàn)原理

    Java使用Redisson分布式鎖實(shí)現(xiàn)原理

    Redisson分布式鎖 之前的基于注解的鎖有一種鎖是基本redis的分布式鎖,這篇文章主要介紹了Java使用Redisson分布式鎖實(shí)現(xiàn)原理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-10-10
  • java迭代器基礎(chǔ)知識(shí)點(diǎn)總結(jié)

    java迭代器基礎(chǔ)知識(shí)點(diǎn)總結(jié)

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于java迭代器基礎(chǔ)知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • Android仿微信實(shí)現(xiàn)左滑顯示刪除按鈕功能

    Android仿微信實(shí)現(xiàn)左滑顯示刪除按鈕功能

    這篇文章主要為大家詳細(xì)介紹了java仿微信實(shí)現(xiàn)左滑顯示刪除按鈕功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 在maven工程里運(yùn)行java main方法

    在maven工程里運(yùn)行java main方法

    這篇文章主要介紹了在maven工程里運(yùn)行java main方法,需要的朋友可以參考下
    2014-04-04
  • Java Scanner如何獲取字符串和帶空格的字符串

    Java Scanner如何獲取字符串和帶空格的字符串

    這篇文章主要介紹了Java Scanner如何獲取字符串和帶空格的字符串問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳談java命令的本質(zhì)邏輯揭秘

    詳談java命令的本質(zhì)邏輯揭秘

    一個(gè)簡單的java命令背后究竟做了些什么事情,很多朋友提出幾個(gè)問題,下面帶領(lǐng)大家一起學(xué)習(xí)Java命令的本質(zhì)邏輯問題,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • java  線程詳解及線程與進(jìn)程的區(qū)別

    java 線程詳解及線程與進(jìn)程的區(qū)別

    這篇文章主要介紹了java 線程詳解及線程與進(jìn)程的區(qū)別的相關(guān)資料,網(wǎng)上關(guān)于java 線程的資料很多,對(duì)于進(jìn)程的資料很是,這里就整理下,需要的朋友可以參考下
    2017-01-01
  • Java使用泛型Class實(shí)現(xiàn)消除模板代碼

    Java使用泛型Class實(shí)現(xiàn)消除模板代碼

    Class作為實(shí)現(xiàn)反射功能的類,在開發(fā)中經(jīng)常會(huì)用到,然而,當(dāng)Class遇上泛型后,事情就變得不是那么簡單了,所以本文就來講講Java如何使用泛型Class實(shí)現(xiàn)消除模板代碼,需要的可以參考一下
    2023-06-06
  • Java中的ArrayList容量及擴(kuò)容方式

    Java中的ArrayList容量及擴(kuò)容方式

    這篇文章主要介紹了Java中的ArrayList容量及擴(kuò)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 解決在for循環(huán)中remove list報(bào)錯(cuò)越界的問題

    解決在for循環(huán)中remove list報(bào)錯(cuò)越界的問題

    這篇文章主要介紹了解決在for循環(huán)中remove list報(bào)錯(cuò)越界的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評(píng)論