中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的裝箱和拆箱是什么

發布時間:2021-07-19 10:44:58 來源:億速云 閱讀:181 作者:chen 欄目:開發技術

本篇內容介紹了“Java中的裝箱和拆箱是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

目錄
  • 裝箱

  • 拆箱

  • ==

  • null

  • 總結

裝箱

八大基本類型都有一個與之對應的類:

基本類型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

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

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

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

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

list.add(8);

即自動地變換成:

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

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

但是由于裝箱操作會創建對象,頻繁的裝箱操作會消耗許多內存,影響性能,所以應該盡量避免裝箱。

拆箱

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

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

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

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

注意裝箱和拆箱是編譯器認可的,而不是虛擬機,編譯器在生成類的字節碼時,插入必要的方法調用,而虛擬機只是執行這些字節碼。

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

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

==

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

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,就創建一個Integer對象,否則執行SMALL_VALUES[i + 128],再定位到SMALL_VALUES:

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

它是一個已經創建好的靜態的Integer數組對象,也就是說 i i i在 [ ? 128 , 128 ) [-128,128) [?128,128)的范圍內時,不會創建新的對象,否則會創建新的對象,這也就是裝箱為什么創建對象,從而消耗內存。

插播反爬信息 )博主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
    }

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

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

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

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

如果是n自動拆箱,則指向常量池同一地址,則結果為true;如果是m自動裝箱,不在區間范圍內,創建新對象,則結果為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自動拆箱則指向常量池同一地址,==結果true;如果x、y拆箱后裝箱成Long,不在區間范圍內,創建新對象,= =結果是false。答案是會拆箱。

那equals為什么輸出false?因為equals除了比較值相同外,還會比較數據類型,顯然兩者拆箱后分別是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

“Java中的裝箱和拆箱是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庆元县| 呼伦贝尔市| 北碚区| 大同市| 五原县| 靖边县| 德化县| 永仁县| 泾源县| 沧州市| 莫力| 吉木萨尔县| 隆昌县| 剑川县| 张北县| 禹城市| 红安县| 高阳县| 杭锦旗| 泽普县| 延津县| 南涧| 昌宁县| 晋城| 邛崃市| 长春市| 衡南县| 柯坪县| 霍林郭勒市| 嘉义市| 榆社县| 上杭县| 花垣县| 翁源县| 陆河县| 泸水县| 屏山县| 井研县| 梧州市| 鹰潭市| 如皋市|