一篇文章帶你從java字節(jié)碼層理解i++和++i
程序目的
從java字節(jié)碼層理解,為何i = i++后,結(jié)果是+1之前的數(shù)值。而i=++i后,結(jié)果是+1之后的值。
關(guān)鍵指令
iload_<n>:
從局部變量表獲取值,并壓入操作數(shù)棧。
istore_<n>:
出棧,然后存儲到局部變量表。
i++示例源碼
public class TestIPulsPlus { public static void main(String[] args) { int i = 8; i = i++; // i = ++i; System.out.println(i); } }
i++執(zhí)行結(jié)果:
8
使用jclasslib查看i++字節(jié)碼
找到main方法的Code區(qū):
圖:i=i++字節(jié)碼
字節(jié)碼解讀
0 bipush 8
把數(shù)值8壓入操作數(shù)棧,壓棧前轉(zhuǎn)為int類型。
2 istore_1
8出棧,存到編號為1的局部變量表。
圖:編號為1的局部變量為1
以上兩行指令,完成了int i = 8;
這行代碼。
3 iload_1
從局部變量表,獲取int值8。然后壓到操作數(shù)棧。
4 iinc 1 by 1
把局部變量表中的i,進(jìn)行+1操作。此時棧里面數(shù)值是8,局部變量表中i為9。
7 istore_1
8出棧,存到編號為1的局部變量表。也就是賦值給i變量。局部變量表的i值從9變?yōu)?。
接下來,解讀i=++i的字節(jié)碼
圖:i=++i;字節(jié)碼
++i示例源碼
public class TestIPulsPlus { public static void main(String[] args) { int i = 8; // i = i++; i = ++i; System.out.println(i); } }
執(zhí)行結(jié)果為:
9
i=++i字節(jié)碼解讀
0 bipush 8
把數(shù)值8壓入操作數(shù)棧,壓棧前轉(zhuǎn)為int類型。
2 istore_1
8出棧,存到編號為1的局部變量表。
圖:編號為1的局部變量為1
以上兩行指令,完成了int i = 8;這行代碼。
3 iinc 1 by 1
把局部變量表中的i,進(jìn)行+1操作。此時,局部變量表中i為9。
6 iload_1
從局部變量表,獲取int值9。然后壓到操作數(shù)棧。
7 istore_1
9出棧,存到編號為1的局部變量表。也就是賦值給i變量。
參考
Chapter 6. The Java Virtual Machine Instruction Set
總結(jié)
i=i++
和i=++i
,第3、4行位置是相反的。
i++
是先執(zhí)行iload_1
,再執(zhí)行iinc 1 by 1。
iload_1:
從局部變量表,獲取int值8。然后壓到操作數(shù)棧。
iinc 1 by 1
:把局部變量表中的i,進(jìn)行+1操作。此時棧里面數(shù)值是8,局部變量表中i為9。
istore_1
時,獲取的是棧中的8,所以最后結(jié)果為8。
而++i
,是先執(zhí)行iinc 1 by 1
,再執(zhí)行iload_1
。
iinc 1 by 1
: 把局部變量表中的i,進(jìn)行+1操作。此時,局部變量表中i為9。
iload_1
:從局部變量表,獲取int值9。然后壓到操作數(shù)棧。
istore_1
時,獲取的是棧中的9,所以最后結(jié)果為9。
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Shiro與Springboot整合開發(fā)的基本步驟過程詳解
這篇文章主要介紹了Shiro與Springboot整合開發(fā)的基本步驟,本文結(jié)合實例代碼給大家介紹整合過程,感興趣的朋友跟隨小編一起看看吧2023-06-06聊聊Spring MVC JSON數(shù)據(jù)交互的問題
我們在開發(fā)中后端經(jīng)常需要接受來自于前端傳遞的Json字符串?dāng)?shù)據(jù),怎么把Json字符串轉(zhuǎn)換為Java對象呢?下面小編給大家?guī)砹薙pring MVC JSON數(shù)據(jù)交互的問題,感興趣的朋友一起看看吧2021-10-10java Executors工具類的相關(guān)方法使用創(chuàng)建
這篇文章主要為大家介紹了java Executors工具類的相關(guān)方法使用創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11利用consul在spring boot中實現(xiàn)分布式鎖場景分析
這篇文章通過場景分析給大家介紹如何利用consul在spring boot中實現(xiàn)簡單的分布式鎖功能,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-09-09Java數(shù)組操作經(jīng)典例題大總結(jié)
數(shù)組是在內(nèi)存中存儲相同數(shù)據(jù)類型的連續(xù)的空間,聲明一個數(shù)組就是在內(nèi)存空間中劃出一串連續(xù)的空間,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)組操作經(jīng)典例題的相關(guān)資料,需要的朋友可以參考下2022-03-03