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

溫馨提示×

溫馨提示×

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

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

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

發布時間:2020-07-13 14:19:14 來源:億速云 閱讀:131 作者:Leah 欄目:編程語言

java的自動裝箱和自動拆箱是什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

自動拆箱和自動裝箱

Java為每種基本數據類型都提供了對應的包裝器類型。舉個例子:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i = 10;
    }
}

這個過程中會自動根據數值創建對應的Integer對象,這就是自動裝箱。再看另外一段代碼:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer integer = 10;
        int i = integer;
    }
}

這個過程中會根據包裝器類型自動將數據轉換為基本類型,這就是自動拆箱。

至于自動裝箱和自動拆箱的原理也很簡單。通過命令行程序,進入CLASSPATH(也就是bin目錄下.class文件所在的路徑),javap反編譯查看一下生成的字節碼:

反編譯出來的內容有很多,我們只關注重點部分:

public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_1
         1: invokestatic  #16                 // Method java/lang/Integer.valueO
f:(I)Ljava/lang/Integer;
         4: astore_1
         5: aload_1
         6: invokevirtual #22                 // Method java/lang/Integer.intVal
ue:()I
         9: istore_2
        10: return

看到在自動裝箱的時候Java虛擬機會自動調用Integer的valueOf方法;在自動拆箱的時候Java虛擬機會自動調用Integer的intValue方法這就是自動拆箱和自動裝箱的原理

小心空指針異常

有這么一段代碼:

public static void main(String[] args) throws Exception
{
    Object obj = getObj(null);
    int i = (Integer)obj;
}
    
public static Object getObj(Object obj)
{
    return obj;
}

這種使用場景很常見,我們把一個int數值放在session或者request中,取出來的時候就是一個類似上面的場景了。所以,小心自動拆箱時候的空指針異常。

小陷阱

看兩段代碼,第一段代碼為:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }
}

運行結果為:

true
false

第二段代碼為:

public class TestMain
{
    public static void main(String[] args)
    {
        Double d1 = 100.0;
        Double d2 = 100.0;
        Double d3 = 200.0;
        Double d4 = 200.0;
        
        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
    }
}

運行結果為:

false
false

產生這樣的結果的原因是:Byte、Short、Integer、Long、Char這幾個裝箱類的valueOf()方法是以128位分界線做了緩存的,假如是128以下且-128以上的值是會取緩存里面的引用的,以Integer為例,其valueOf(int i)的源代碼為:

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }

而Float、Double則不會,原因也很簡單,因為byte、Short、integer、long、char在某個范圍內的整數個數是有限的,但是float、double這兩個浮點數卻不是。

關于java的自動裝箱和自動拆箱是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

AI

屏东县| 承德市| 随州市| 武清区| 全椒县| 虎林市| 昌都县| 开封县| 永宁县| 万年县| 太仆寺旗| 拉孜县| 营口市| 凤庆县| 黎城县| 新密市| 东兰县| 拉萨市| 法库县| 松江区| 肥东县| 桐庐县| 涞水县| 游戏| 米泉市| 呼图壁县| 女性| 额敏县| 郁南县| 石台县| 清涧县| 万盛区| 灵寿县| 新野县| 英吉沙县| 绥宁县| 青铜峡市| 灵宝市| 石泉县| 玉环县| 上思县|