【100%解决】JAVA新人面试杀手i++和++i的区别、原理分析

概述

面试官:“你知道i++和++i的区别吗?”
:“不好意思,这个我不太清楚”。、
面试官:“好吧,那我们有消息再通知你”。

OK。以上就是我刚毕业出去面试的时候我们被老板问到问题,和我的回答。当然最后并没有被通知。

所以今天我们就来详细的看一下i++和++i到底有什么区别?原理是什么?好了。我们开始吧。

初见i++和++i

相信初学java的同学并不会在意i++和++i有什么区别。应该都是觉得是本身加1。(起码我自己初期是这样)我们看下下面的两个代码。大家可以思考一下两个结果都输出了什么结果。

public class ippAndppi {

    public static void main(String[] a) {
        ipp();
        ppi();
    }

    public static void ipp() {
        int i = 0;
        int k = i++;
        System.out.println("k=" + k);

    }

    public static void ppi() {
        int i = 0;
        int j = ++i;
        System.out.println("j=" + j);
    }
}

**正确答案是 **

在这里插入图片描述
在这里插入图片描述

为什么++i和i++结果不一致。我们首先来讲一下i++和++i的区别。

i++和++i区别

i++ 和 ++i 在理论上的区别是:
i++:是先把i拿出来使用,然后再+1;
++i :是先把i+1,然后再拿出来使用;

可能有的同学感觉比较抽象,似懂非懂。那我给大家举一个小例子。大家就明白了。

比如我们做一盘菜。然后呢感觉有点甜。想要加点盐。那么

i++就是先尝一口然后再放盐。那尝起来发现味道没变。
++i就是先放盐然后再尝一口。发现变咸了。

这样讲的话大家应该就好懂一点了。那为什么会这样呢?

原理

要探究出来原理。我们可以看下编译后的源码。

首先先看下i++的

源码

    public static void ipp() {
        int i = 0;
        int k = i++;
        System.out.println("k=" + k);//k=0

    }

这是编译之后的

  public static void ipp();
    Code:
       0: iconst_0     // 将int型(0)推送至栈顶
       1: istore_0     // 将栈顶int型数值存入第2个本地变量 (i) 此时 i=0
       2: iload_0      // 将第一个int型本地变量(i)推送至栈顶 此时i=0
       3: iinc          0, 1// 本地变量i自增
       6: istore_1      // 将栈顶int型数值存入第2个本地变量 (k)此是k=0
       7: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      10: new           #5                  // class java/lang/StringBuilder

示意图

在这里插入图片描述

再来看下++i的

源码

 public static void ppi() {
        int i = 0;
        int j = ++i;
        System.out.println("j=" + j);
    }

编译之后

public static void ppi();
    Code:
       0: iconst_0      // 将int型(0)推送至栈顶
       1: istore_0       // 将栈顶int型数值存入第2个本地变量 (i) 此时
       2: iinc          0, 1// 本地变量i自增 此时i=1
       5: iload_0        // 将第一个int型本地变量(i)推送至栈顶 此时i=0
       6: istore_1       // 将栈顶int型数值存入第2个本地变量 (k)此是k=0
       7: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;

示意图

在这里插入图片描述

根据上面两个我们可以看到i++和++i的区别主要是
i++先自增然后再赋值
++i是先赋值再自增

学完上面的基础之后大家可以试着想一下下面这两个的输出。

 public static void ipp100(){
        int i=0;
        for(int x=0;x<100;x++){
         i=i++;
        }
        System.out.println("i=" + i);

    }
public static void ppi100(){
        int j=0;
        for(int x=0;x<100;x++){
         j=++j;
        }
        System.out.println("j=" + j);

    }

答案是

在这里插入图片描述
在这里插入图片描述

好了。以上就是i++和++i的区别、以及原理。如果有什么问题,希望大家评论见。谢谢

你可能感兴趣的:(【100%解决】JAVA新人面试杀手i++和++i的区别、原理分析)