日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从字节码层面分析==比较integer和int

發布時間:2024/4/18 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从字节码层面分析==比较integer和int 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public class aaa {public static void main(String[] args) {Integer a = 1;int b = 1;System.out.println(a == b);} }

這樣一段代碼輸出的是true,通過javap -c -l得到相應的字節碼指令:

Code:0: iconst_11: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;4: astore_15: iconst_16: istore_27: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;10: aload_111: invokevirtual #4 // Method java/lang/Integer.intValue:()I14: iload_215: if_icmpne 2218: iconst_119: goto 2322: iconst_023: invokevirtual #5 // Method java/io/PrintStream.println:(Z)V26: return

可以看出先把兩個1存到操作棧中,然后把操作棧中的1存到局部變量表中,最后在比較的時候再把兩個1從局部變量表中放到操作數棧中執行if_icmpne邏輯判斷來進行比較。其中astore和istore是精髓,astore代表把引用型數值存入指定本地變量(局部變量表中),在Integer的源碼中,會將-128-127的數存入cache中,cache是一個數組,數組里的每一個下標里存的值都是一個數,當然和本題無關,本題為true是因為引用Integer會自動拆箱和int類型比,所以大于127也是true。
當數值改為127以上時,唯一改變的字節碼指令是iconst->sipush,這是因為:
取值-128~127采用bipush指令,
取值-32768~32767采用sipush指令
取值-2147483648~2147483647采用 ldc 指令。

Code:0: sipush 1283: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;6: astore_17: sipush 12810: istore_211: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;14: aload_115: invokevirtual #4 // Method java/lang/Integer.intValue:()I18: iload_219: if_icmpne 2622: iconst_123: goto 2726: iconst_027: invokevirtual #5 // Method java/io/PrintStream.println:(Z)V30: return

上面結果還是true。
好了 下來看看int和int之間比較的字節碼,把剛才的一個integer類型改為int:

Code:0: bipush 1272: istore_13: bipush 1275: istore_26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;9: iload_110: iload_211: if_icmpne 1814: iconst_115: goto 1918: iconst_019: invokevirtual #3 // Method java/io/PrintStream.println:(Z)V22: return

可以看到只是astore->istore
最后我們再來看看兩個integer之間的比較:

Code:0: bipush 1272: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;5: astore_16: bipush 1278: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;11: astore_212: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;15: aload_116: aload_217: if_acmpne 2420: iconst_121: goto 2524: iconst_025: invokevirtual #4 // Method java/io/PrintStream.println:(Z)V28: return

可以看到兩個都變成了astore,結果也是true
再看看大于127:

Code:0: sipush 1283: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;6: astore_17: sipush 12810: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;13: astore_214: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;17: aload_118: aload_219: if_acmpne 2622: iconst_123: goto 2726: iconst_027: invokevirtual #4 // Method java/io/PrintStream.println:(Z)V30: return

雖然字節碼相差不大,但是結果是false,是因為java虛擬機在啟動時,會把-128-127之間的數字放到一個cache中(上面說過),所以在大于127時指向的地址是不相同的,比較為false。
有趣的是兩個int相比較是永遠true的,那是因為int在比較時,jvm會直接把兩個int所對應的值放到常量池中,而integer不會。
cache源碼:

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

總結

以上是生活随笔為你收集整理的从字节码层面分析==比较integer和int的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。