天天看點

從 JVM 層面了解 i++ 和 ++i 的真正差別!

如果隻用普通的知識解釋i++和++i的話

i++ 先将i指派再++

++i 先++再指派

但是這簡單的回答并不能入吸引面試官的眼球,如果用java位元組碼指令分析則效果完全不同。

運作結果

從 JVM 層面了解 i++ 和 ++i 的真正差別!

通過<code>javap -v out</code>目錄下的class檔案名 在終端運作得到如下結果

第一類問題

對應的指令為

從 JVM 層面了解 i++ 和 ++i 的真正差別!

先将i1的值為10入棧(bipush),然後将int類型的值從棧中存到局部變量表0的位置,然後執行iinc将0位置的值+1,然後将局部變量表0位置的數入棧執行輸出操作

是以i1的值為11

先将i2的值為10入棧(bipush),然後将int類型的值從棧中存到局部變量表1的位置,然後執行iinc将1位置的值+1,然後将局部變量表1位置的數入棧執行輸出操作

是以i2的值為11

由于沒有指派操作,差別不大。

第二類問題

從 JVM 層面了解 i++ 和 ++i 的真正差別!
從 JVM 層面了解 i++ 和 ++i 的真正差別!

先将i3入棧存儲到局部變量表2的位置,然後将它入棧,執行iinc将2位置的值加一,i4存儲到局部表量表3的位置

是以i3是11,i4還是10

将i5入棧存儲到局部變量表4的位置,由于是++i是以先iinc将4位置的值加一,然後将局部變量表4的值入棧,執行指派操作,是以都是11

第三類問題

從 JVM 層面了解 i++ 和 ++i 的真正差別!
從 JVM 層面了解 i++ 和 ++i 的真正差別!

先将i7入棧,然後存到局部變量表6的位置,先把i6入棧,然後把6處的值加一,由于又将這個值存儲到局部變量表6處,是以産生覆寫又把值變為10。

而++i不會産生覆寫先執行加一然後再把值入棧,在指派給局部變量表中,是以i8為11。

第四類問題

從 JVM 層面了解 i++ 和 ++i 的真正差別!
從 JVM 層面了解 i++ 和 ++i 的真正差別!

先将i9=10入棧,然後存在局部變量表8的位置

先iload将8位置的i9入棧然後執行iinc将8處的i9加一,然後執行++i9,在将8處的i9加一

此時i9=10+1+1為12,然後将8位置的i9入棧,執行add将棧中的兩i9相加,得到的值存儲到局部變量表9的位置

是以i10=10+12(i9++後還是10,++i9後是12,因為執行了兩次iinc操作)

然後調用虛方法和靜态方法,在将9處的值入棧執行輸出語句

本文為「默默無聞代碼人」的原創文章

下一篇: I2C總線