最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解

 更新時(shí)間:2023年10月13日 10:42:42   作者:ゞ浪人與酒丶0  
這篇文章主要介紹了Java中的i++與++i的實(shí)現(xiàn)原理詳解,在Java中,i++是一種常見的遞增操作符,用于將變量i的值增加1,它是一種簡潔且方便的方式來實(shí)現(xiàn)循環(huán)和計(jì)數(shù)功能,i++可以用于各種情況,本文來看一下其實(shí)現(xiàn)原理,需要的朋友可以參考下

前言

在Java中,i++是一種常見的遞增操作符,用于將變量i的值增加1。

它是一種簡潔且方便的方式來實(shí)現(xiàn)循環(huán)和計(jì)數(shù)功能。i++可以用于各種情況,例如在for循環(huán)中迭代數(shù)組或列表的元素,或者在計(jì)數(shù)器中跟蹤某個(gè)事件的發(fā)生次數(shù)。

通過使用i++,我們可以輕松地實(shí)現(xiàn)自增操作,而無需手動編寫i = i + 1的代碼。

i++

首先先看一段代碼

public class Test {
    public static void main(String[] args) {
        foo();
    }
    public static void foo() {
       int i = 0;
        for (int j = 0; j < 50; j++) {
            i = i++;
        }
        System.out.println(i);
    }
}

執(zhí)行上述代碼輸出結(jié)果是0,而不是50

0

對應(yīng)字節(jié)碼

public class com.yxzapp.Test {
  public com.yxzapp.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method foo:()V
       3: return
  public static void foo();
    Code:
       0: iconst_0
       1: istore_0
       2: iconst_0
       3: istore_1
       4: iload_1
       5: bipush        50
       7: if_icmpge     21
      10: iload_0                           // 把局部變量下標(biāo)0的變量加載到操作數(shù)棧上
      11: iinc          0, 1                // 對局部變量表表為0的int變量直接加1,但是這												個(gè)時(shí)候棧頂元素沒有變化,還是0
      14: istore_0 							// 將棧頂元素出棧賦值給局部變量下標(biāo)0變量 也就												是i。 此時(shí) 局部變量 i 又被賦值為0,前面 iinc  											指令對i 的加一操作一樣被覆蓋
      15: iinc          1, 1
      18: goto          4
      21: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      24: iload_0
      25: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      28: return
}

image.png

在字節(jié)碼層面是先把 i 加載到操作數(shù)棧上,隨后才對局部變量 i 執(zhí)行加一操作 , 留在操作數(shù)棧頂?shù)倪€是 i 的舊值。則這個(gè)變量得到的是 i 加一之前的值

++i

public class Test {
    public static void main(String[] args) {
        foo();
    }
    public static void foo() {
       int i = 0;
        for (int j = 0; j < 50; j++) {
            i = ++i;
        }
        System.out.println(i);
    }
}

對應(yīng)字節(jié)碼

public class com.yxzapp.Test {
  public com.yxzapp.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method foo:()V
       3: return
  public static void foo();
    Code:
       0: iconst_0
       1: istore_0
       2: iconst_0
       3: istore_1
       4: iload_1
       5: bipush        50
       7: if_icmpge     21
      10: iinc          0, 1                // 對局部變量表表為0的int變量直接加1,
      13: iload_0                           // 把局部變量下標(biāo)0的變量加載到操作數(shù)棧上
      14: istore_0                          // 將棧頂元素出棧賦值給局部變量下標(biāo)0變量
      15: iinc          1, 1
      18: goto          4
      21: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      24: iload_0
      25: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      28: return
}

可以看出 i= ++i , 先對局部變量表下標(biāo)為0的變量加 1 ,然后才把它加載到操作數(shù)棧上,隨后又從操作數(shù)棧上出棧賦值給局部變量表中下標(biāo)為 0 的變量

image.png

總結(jié) 

  • i++ 即后加加,原理是:先自增,然后返回自增之前的值、
  • ++i 即前加加,原理是:先自增,然后返回自增之后的值

到此這篇關(guān)于Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)i++與++i的實(shí)現(xiàn)原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中動態(tài)地改變數(shù)組長度及數(shù)組轉(zhuǎn)Map的代碼實(shí)例分享

    Java中動態(tài)地改變數(shù)組長度及數(shù)組轉(zhuǎn)Map的代碼實(shí)例分享

    這篇文章主要介紹了Java中動態(tài)地改變數(shù)組長度及數(shù)組轉(zhuǎn)map的代碼分享,其中轉(zhuǎn)Map利用到了java.util.Map接口,需要的朋友可以參考下
    2016-03-03
  • Java線程狀態(tài)轉(zhuǎn)換的詳細(xì)過程

    Java線程狀態(tài)轉(zhuǎn)換的詳細(xì)過程

    Java線程狀態(tài)轉(zhuǎn)換是Java多線程編程中的關(guān)鍵概念,對于理解和優(yōu)化并發(fā)程序至關(guān)重要,Java線程在其生命周期中經(jīng)歷多種狀態(tài),這些狀態(tài)之間的轉(zhuǎn)換是由線程調(diào)度器根據(jù)特定的策略來決定的,以下是對Java線程狀態(tài)轉(zhuǎn)換的詳細(xì)說明,需要的朋友可以參考下
    2025-09-09
  • Java 得到集合中所有子集

    Java 得到集合中所有子集

    本文主要介紹了Java 得到集合中所有子集的方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題

    springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題

    這篇文章主要介紹了springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Maven 生成打包可執(zhí)行jar包的方法步驟

    Maven 生成打包可執(zhí)行jar包的方法步驟

    這篇文章主要介紹了Maven 生成打包可執(zhí)行jar包的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 雙重檢查鎖定模式Java中的陷阱案例

    雙重檢查鎖定模式Java中的陷阱案例

    這篇文章主要介紹了雙重檢查鎖定模式Java中的陷阱,雙重檢查鎖定(也叫做雙重檢查鎖定優(yōu)化)是一種軟件設(shè)計(jì)模式,它的作用是減少延遲初始化在多線程環(huán)境下獲取鎖的次數(shù),尤其是單例模式下比較突出,想具體了解的小伙伴可以參考下面文章內(nèi)容,附呦詳細(xì)的舉例說明
    2021-10-10
  • Linux下Hbase安裝配置教程

    Linux下Hbase安裝配置教程

    本文給大家介紹了Linux下Hbase安裝配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • springboot中使用redis由淺入深解析

    springboot中使用redis由淺入深解析

    這篇文章主要由淺入深為大家介紹了springboot中使用redis的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • java中獲取時(shí)間戳的多種常用方式

    java中獲取時(shí)間戳的多種常用方式

    在Java中,獲取時(shí)間戳(毫秒數(shù))有多種方式,下面給大家分享幾種常用的方法來獲取時(shí)間戳,感興趣的朋友一起看看吧
    2025-05-05
  • Mybatis 中的sql批量修改方法實(shí)現(xiàn)

    Mybatis 中的sql批量修改方法實(shí)現(xiàn)

    在項(xiàng)目中遇到需要批量更新的功能,原本想的是在Java中用循環(huán)訪問數(shù)據(jù)庫去更新,但是心里總覺得這樣做會不會太頻繁了,太耗費(fèi)資源了,效率也很低,查了下mybatis的批量操作,原來確實(shí)有<foreach>標(biāo)簽可以做到,下面通過本文給大家介紹下
    2017-01-01

最新評論

普安县| 大新县| 虹口区| 灌云县| 来安县| 长宁县| 城步| 瑞安市| 武宣县| 扬州市| 上思县| 香港| 南昌县| 凤阳县| 大荔县| 贵港市| 昭觉县| 稻城县| 蓬溪县| 荣昌县| 白沙| 都江堰市| 清水河县| 南通市| 安远县| 同江市| 嘉鱼县| 平原县| 鹤山市| 焦作市| 灵寿县| 安岳县| 沧州市| 庆安县| 云阳县| 岱山县| 拉孜县| 大名县| 佛山市| 西城区| 巴青县|