首頁 > Java > Java入門 > 主體

深入理解java中的自動裝箱與拆箱

王林
發布: 2019-12-19 11:55:29
轉載
2899 人瀏覽過

深入理解java中的自動裝箱與拆箱

一、什麼是裝箱,什麼是拆箱

裝箱:把基本資料型別轉換成包裝類別。

拆箱:把包裝類別轉換為基本資料型別。

基本資料型別所對應的包裝類別:

int(幾個位元組4)- Integer

byte(1)- Byte

short (2)- Short

long(8)- Long

float(4)- Float

double(8)- Double

char(2 )- Character

boolean(未定義)- Boolean

免費線上影片學習教學推薦:java影片教學

二、先來看看手動裝箱和手動拆箱

例子:拿int和Integer舉例

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();
登入後複製
登入後複製

手動裝箱是透過valueOf完成的,大家都知道= 右邊值賦給左邊,3是一個int類型的,賦給左邊就變成了Integer包裝類別。

手動拆箱是透過intValue()完成的,透過程式碼可以看到i1 從Integer變成了int

三、手動看完了,來看自動的

為了減輕技術人員的工作,java從jdk1.5之後變成自動裝箱與拆箱,還拿上面那個舉例:

手動:

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();
登入後複製
登入後複製

自動

Integer i1=3;
int i2=i1;
登入後複製

這是已經預設自動裝好和拆好了。

四、從幾題目中加深對自動裝箱和拆箱的理解

(1)

Integer a = 100;
int b = 100;
System.out.println(a==b);结果为 true
登入後複製

原因:a 會自動拆箱和b 進行比較,所以為true

(2)

Integer a = 100;
Integer b = 100;
System.out.println(a==b);//结果为true
Integer a = 200;
Integer b = 200;
System.out.println(a==b);//结果为false
登入後複製

這就發生一個有意思的事了,為什麼兩個變數一樣的,只有值不一樣的一個是true ,一個是false。

原因:這種情況就要說一下== 這個比較符號了,== 比較的記憶體位址,也就是new 出來的物件的記憶體位址,看到這你們可能會問這好像沒有new啊,但其實Integer a=200; 200前面是預設有new Integer的,所用記憶體位址不一樣== 比較的就是false了,但100為什麼是true呢?這是因為 java中的常數池 我們可以點開 Integer的源碼看看。

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }
登入後複製

在對-128到127 之間的進行比較時,不會new 對象,而是直接到常數池中獲取,所以100是true,200超過了這個範圍然後進行了new 的操作,所以記憶體位址是不同的。

(3)

Integer a = new Integer(100);
Integer b = 100;
System.out.println(a==b);
//结果为false
登入後複製

這跟上面那個100的差不多啊,從常數池中拿,為什麼是false呢?

原因:new Integer(100)的原因,100雖然可以在常數池中拿,但架不住你直接給new 了一個物件啊,所用這兩個記憶體位址是不同的。

(4)

Integer a = 100;
Integer b= 100;
System.out.println(a == b);
//结果true
a = 200;
b = 200;
System.out.println(c == d);
//结果为false
登入後複製

原因:= 號右邊值賦給左邊a,b已經是包裝類了,200不在常數池中,把int 類型200 賦給包裝類,自動裝箱又因為不在常數池中所以預設new了對象,所以結果為false。

更多相關文章教學可以存取:java語言入門

#

以上是深入理解java中的自動裝箱與拆箱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板