成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java拆箱裝箱理解(以Long long為例)

dinfer / 2244人閱讀

摘要:學(xué)過的同學(xué)或多或少都聽過自動裝箱拆箱下邊通過代碼和字節(jié)碼文件加深下對自動拆箱裝箱的理解為什么要有包裝類型作為和基本數(shù)據(jù)類型對應(yīng)的類類型存在,方便涉及到對象的操作比如泛型必須要求我們是對象數(shù)據(jù)類型自動裝箱拆箱發(fā)生在什么時候自動拆箱裝箱發(fā)生在代

學(xué)過Java的同學(xué)或多或少都聽過自動裝箱拆箱,下邊通過代碼和字節(jié)碼文件加深下對自動拆箱裝箱的理解.

1為什么要有包裝類型?

作為和基本數(shù)據(jù)類型對應(yīng)的類類型存在,方便涉及到對象的操作,比如泛型必須要求我們是對象數(shù)據(jù)類型.

2 自動裝箱拆箱發(fā)生在什么時候?

自動拆箱裝箱發(fā)生在代碼編譯期間.

通過例子來看下自動拆箱裝箱是怎么做的:

public static void main(String[] args) { 
        Long a = 100L;
        Long b = 100L;
        long c = 100L;
        Long d = new Long(100);

        Long e = 1000L;
        Long f = 1000L;
        
        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(a == d);
        System.out.println(c == d);
        System.out.println(e == f);
    }

下面先公布答案:
true
true
false
true
false

蒙 a==b為true; 為什么 e==f就是false? a和c是怎么比較的? a和d又是什么情況?

接下來我們通過字節(jié)碼文件看看到底有什么奧秘:

  public static void main(java.lang.String[]);
    Code:
       0: ldc2_w        #2                  // long 100l
       3: invokestatic  #4                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
       6: astore_1
       7: ldc2_w        #2                  // long 100l
      10: invokestatic  #4                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      13: astore_2
      14: ldc2_w        #2                  // long 100l
      17: lstore_3
      18: new           #5                  // class java/lang/Long
      21: dup
      22: ldc2_w        #2                  // long 100l
      25: invokespecial #6                  // Method java/lang/Long."":(J)V
      28: astore        5
      30: ldc2_w        #7                  // long 1000l
      33: invokestatic  #4                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      36: astore        6
      38: ldc2_w        #7                  // long 1000l
      41: invokestatic  #4                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      44: astore        7
      46: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
      49: aload_1
      50: aload_2
      51: if_acmpne     58
      54: iconst_1
      55: goto          59
      58: iconst_0
      59: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
      62: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
      65: aload_1
      66: invokevirtual #11                 // Method java/lang/Long.longValue:()J
      69: lload_3
      70: lcmp
      71: ifne          78
      74: iconst_1
      75: goto          79
      78: iconst_0
      79: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
      82: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
      85: aload_1
      86: aload         5
      88: if_acmpne     95
      91: iconst_1
      92: goto          96
      95: iconst_0
      96: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
      99: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
     102: lload_3
     103: aload         5
     105: invokevirtual #11                 // Method java/lang/Long.longValue:()J
     108: lcmp
     109: ifne          116
     112: iconst_1
     113: goto          117
     116: iconst_0
     117: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
     120: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
     123: aload         6
     125: aload         7
     127: if_acmpne     134
     130: iconst_1
     131: goto          135
     134: iconst_0
     135: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
     138: return
}

鬼畫符?我們看下這些鬼到底什么意思.

3: invokestatic #4 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
意思是執(zhí)行 Long 的valueof()方法 參數(shù)為基本類型 返回值為Long類型
看看Long的valueof方法

    public static Long valueOf(long l) {
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
    }

如果傳入的基本類型在-128-127之內(nèi)就,就從LongCache中取數(shù)據(jù)返回給我們.看下LongCache干了啥

    private static class LongCache {
        private LongCache(){}
        static final Long cache[] = new Long[-(-128) + 127 + 1];
        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Long(i - 128);
        }
    }

原來如此,-128-127就直接返回給我們chche中的數(shù)據(jù),超出這個范圍直接new一個給我們.a==b為true,e==f為false就說得通了.

  65: aload_1
  66: invokevirtual #11                 // Method java/lang/Long.longValue:()J
  69: lload_3
  70: lcmp

拿出變量a,執(zhí)行Long.longValue()返回一個基本數(shù)據(jù)類型,在和c比較.看下longValue方法

   /**
     * Returns the value of this {@code Long} as a
     * {@code long} value.
     */
    public long longValue() {
        return value;
    }

這部就是兩個基本數(shù)據(jù)類型比較嗎.

      85: aload_1
      86: aload         5
      88: if_acmpne     95

取出a和d直接比較內(nèi)存地址是否一樣.鐵定不一樣呀.

剩下的大家可以自己看下,有不明白的可以評論問.

3 總結(jié)

自動拆箱裝箱沒有什么神秘的.字節(jié)碼可以告訴我們很東西.如果某些概念理解不了,試著看看字節(jié)碼文件.說不定會豁然開朗.

如果發(fā)現(xiàn)文章中有不妥之處,希望大家指出,共同進(jìn)步.

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75983.html

相關(guān)文章

  • 深入淺出了解“裝箱拆箱

    摘要:本章部分內(nèi)容從源碼中解讀一些自動裝箱與拆箱的原理,以及會出現(xiàn)的一些陷阱已經(jīng)性能等。例題分析我們通過幾個經(jīng)典的問題,來看看大家到底理解了裝箱與拆箱的知識點沒。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190426221918208.pn...

    FullStackDeveloper 評論0 收藏0
  • int和Integer深入分析

    摘要:對象頭的另外一部分是類型指針,即對象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過這個指針來確定這個對象是哪個類的實例。并不是所有的虛擬機(jī)實現(xiàn)都必須在對象數(shù)據(jù)上保留類型指針,換句話說,查找對象的元數(shù)據(jù)信息并不一定要經(jīng)過對象本身,這點將在節(jié)討論。 目錄介紹 1.關(guān)于int和Integer的問題區(qū)別分析 2.Integer的值緩存的原理 2.1 Java 5 中引入緩存特性 2.2 Intege...

    Half 評論0 收藏0
  • 源碼|jdk源碼之Object及裝箱類型分析

    摘要:作為條件變量的的不僅可以認(rèn)為內(nèi)嵌了一把鎖,還內(nèi)嵌了一個條件變量。操作條件變量的函數(shù)將當(dāng)前線程在條件變量上阻塞,一般是為了等待其他線程的某件事情執(zhí)行完成。其它裝箱類其它裝箱類的代碼這里就不分析了。重點關(guān)注下各裝箱類的緩存范圍。 jdk源碼讀到現(xiàn)在這里,重要的集合類也讀了一部分了。集合類再往下讀的話,就要涉及到兩個方向。第一,是比較典型的但是不常用的數(shù)據(jù)結(jié)構(gòu),這部分我準(zhǔn)備將數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)、回...

    VioletJack 評論0 收藏0
  • Java 性能要點:自動裝箱/ 拆箱 (Autoboxing / Unboxing)

    摘要:文章主要介紹通過改進(jìn)就已存在的骨灰級特性大幅度提高應(yīng)用性能。在繼續(xù)解釋造成差異的細(xì)節(jié)之前,讓我們仔細(xì)回味一下中的這兩個概念自動裝箱與拆箱。 【編者按】本文作者為 Ali Kemal TASCI,最早于2016年4月9日發(fā)布于DZONE社區(qū)。文章主要介紹通過改進(jìn) Java 1.5 就已存在的骨灰級特性大幅度提高應(yīng)用性能。 本文系 OneAPM 工程師編譯呈現(xiàn),以下為正文。 如果我告訴你:...

    Jackwoo 評論0 收藏0
  • 深入淺出 Java 中的包裝類

    摘要:前陣子,我們分享了中的基本數(shù)據(jù)類型轉(zhuǎn)換這篇文章,對許多粉絲還是有帶來幫助的,今天講一下包裝類的的由來,及自動裝箱拆箱的概念和原理。下面是基本數(shù)據(jù)類型與對應(yīng)的包裝類型。 showImg(https://segmentfault.com/img/remote/1460000016537706); 前陣子,我們分享了《Java中的基本數(shù)據(jù)類型轉(zhuǎn)換》這篇文章,對許多粉絲還是有帶來幫助的,今天講...

    ytwman 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<