91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

java中的自動裝箱和拆箱是什么

發布時間:2020-06-16 11:03:22 來源:億速云 閱讀:119 作者:Leah 欄目:編程語言

java中的自動裝箱和拆箱是什么?如果你剛好也有這個困惑,不妨參照這篇文章。閱讀完整文相信大家對java中的自動裝箱和拆箱有了一定的認識。

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

裝箱:把基本數據類型轉換為包裝類。

拆箱:把包裝類轉換為基本數據類型。

基本數據類型所對應的包裝類:

int(幾個字節4)- Integer

byte(1)- Byte

short(2)- Short

long(8)- Long

float(4)- Float

double(8)- Double

char(2)- Character

boolean(未定義)- Boolean

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

例子:拿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中的自動裝箱和拆箱有進一步的了解嗎?如果還想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。

向AI問一下細節

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

AI

永定县| 淮南市| 仙居县| 牟定县| 革吉县| 唐河县| 浮梁县| 沂源县| 昭平县| 广丰县| 皋兰县| 庆安县| 永福县| 台中县| 盐津县| 八宿县| 许昌县| 新乡市| 鱼台县| 新巴尔虎左旗| 长海县| 林甸县| 谷城县| 禹州市| 永胜县| 宝应县| 阜阳市| 盘锦市| 成安县| 铜川市| 博兴县| 湖州市| 延庆县| 察雅县| 东明县| 乐清市| 许昌县| 嘉峪关市| 三亚市| 德惠市| 平舆县|