一篇文章帶你從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)文章
Java并發(fā)多線程編程之CountDownLatch的用法
這篇文章主要介紹了Java并發(fā)多線程編程之CountDownLatch的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
關(guān)于SpringBoot配置文件application.properties的路徑問題
這篇文章主要介紹了關(guān)于SpringBoot配置文件application.properties的路徑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
淺析Spring boot 中 logback 配置<springPropert
這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
Java的優(yōu)先隊列PriorityQueue原理及實例分析
這篇文章主要介紹了Java的優(yōu)先隊列PriorityQueue原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Map映射LinkedHashSet與LinkedHashMap應(yīng)用解析
這篇文章主要為大家介紹了Map映射LinkedHashSet與LinkedHashMap的應(yīng)用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步2022-03-03
SpringBoot自動裝配Condition的實現(xiàn)
Spring4.0新增@Conditional注解,用于條件化Bean的注冊,通過實現(xiàn)Condition接口并重寫matches方法,可以控制Bean的創(chuàng)建與否,感興趣的可以了解一下2024-10-10

