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

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

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

前言

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

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

通過使用i++,我們可以輕松地實現(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,但是這												個時候棧頂元素沒有變化,還是0
      14: istore_0 							// 將棧頂元素出棧賦值給局部變量下標(biāo)0變量 也就												是i。 此時 局部變量 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 的舊值。則這個變量得到的是 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的實現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)i++與++i的實現(xiàn)原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

    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)換的詳細說明,需要的朋友可以參考下
    2025-09-09
  • Java 得到集合中所有子集

    Java 得到集合中所有子集

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

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

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

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

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

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

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

    Linux下Hbase安裝配置教程

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

    springboot中使用redis由淺入深解析

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

    java中獲取時間戳的多種常用方式

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

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

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

最新評論

富民县| 咸阳市| 台山市| 遂川县| 镇沅| 乌兰县| 德昌县| 鹤山市| 库车县| 乐平市| 旬邑县| 安龙县| 张家界市| 沁源县| 建宁县| 武功县| 乌海市| 玛曲县| 农安县| 恩平市| 上思县| 盐亭县| 阳春市| 中江县| 临汾市| 象山县| 寿光市| 石首市| 垦利县| 商丘市| 淮北市| 汝阳县| 原阳县| 濮阳市| 永吉县| 凤翔县| 青阳县| 阜城县| 平昌县| 嘉兴市| 个旧市|