从字节码层面分析==比较integer和int
這樣一段代碼輸出的是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 指令。
上面結果還是true。
好了 下來看看int和int之間比較的字節碼,把剛才的一個integer類型改為int:
可以看到只是astore->istore
最后我們再來看看兩個integer之間的比較:
可以看到兩個都變成了astore,結果也是true
再看看大于127:
雖然字節碼相差不大,但是結果是false,是因為java虛擬機在啟動時,會把-128-127之間的數字放到一個cache中(上面說過),所以在大于127時指向的地址是不相同的,比較為false。
有趣的是兩個int相比較是永遠true的,那是因為int在比較時,jvm會直接把兩個int所對應的值放到常量池中,而integer不會。
cache源碼:
總結
以上是生活随笔為你收集整理的从字节码层面分析==比较integer和int的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录x86调试命令总结
- 下一篇: 用堆实现第k大元素