欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章帶你從java字節(jié)碼層理解i++和++i

 更新時間:2021年09月26日 09:56:21   作者:快樂檸檬  
這篇文章帶你從java字節(jié)碼層理解i++和++i,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

程序目的

從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傳引用問題舉例詳解

    Java傳引用問題舉例詳解

    引用傳遞是Java中一個重要的概念,它與值傳遞不同,可以使得函數(shù)或方法可以修改傳入的對象,這篇文章主要給大家介紹了關(guān)于Java傳引用問題的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • java實現(xiàn)對Hadoop的操作

    java實現(xiàn)對Hadoop的操作

    這篇文章主要介紹了java實現(xiàn)對Hadoop的操作,通過非常完整詳細(xì)的代碼展示了如何去進(jìn)行一系列操作,包括基本操作,文件讀寫,需要的朋友可以參考下
    2021-07-07
  • Shiro與Springboot整合開發(fā)的基本步驟過程詳解

    Shiro與Springboot整合開發(fā)的基本步驟過程詳解

    這篇文章主要介紹了Shiro與Springboot整合開發(fā)的基本步驟,本文結(jié)合實例代碼給大家介紹整合過程,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • 深入理解Java反射

    深入理解Java反射

    在理解反射原理之前先要搞清類型信息。接下來通過本文給大家介紹java反射的深入理解,非常不錯,具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-07-07
  • 聊聊Spring MVC JSON數(shù)據(jù)交互的問題

    聊聊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-10
  • java Executors工具類的相關(guān)方法使用創(chuàng)建

    java Executors工具類的相關(guān)方法使用創(chuàng)建

    這篇文章主要為大家介紹了java Executors工具類的相關(guān)方法使用創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 基于java HashMap插入重復(fù)Key值問題

    基于java HashMap插入重復(fù)Key值問題

    這篇文章主要介紹了基于java HashMap插入重復(fù)Key值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 利用consul在spring boot中實現(xiàn)分布式鎖場景分析

    利用consul在spring boot中實現(xiàn)分布式鎖場景分析

    這篇文章通過場景分析給大家介紹如何利用consul在spring boot中實現(xiàn)簡單的分布式鎖功能,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-09-09
  • Java數(shù)組操作經(jīng)典例題大總結(jié)

    Java數(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
  • 面試中遇到的java逃逸分析問題

    面試中遇到的java逃逸分析問題

    這篇文章主要介紹了面試中遇到的java逃逸分析問題,逃逸分析(Escape Analysis)簡單來講就是,Java Hotspot 虛擬機(jī)可以分析新創(chuàng)建對象的使用范圍,并決定是否在 Java 堆上分配內(nèi)存的一項技術(shù)。,需要的朋友可以參考下
    2019-06-06

最新評論