高频面试题--自增系列

高频面试题----------自增系列案例

  • 高频面试题:自增系列(01)
    • 知识拓展
    • 题目分析(行分解)
    • 查看main方法字节码文件  -- 理解执行流程
    • 小结

高频面试题:自增系列(01)

大家可以试着自己理解一下:

    public static void main(String[] args) {
        int i = 1;
        i=i++;
        int j = i++;
        int k = i + ++i * i++;

        System.out.println(i);
        System.out.println(j);
        System.out.println(k);
	}

知识拓展

  • java虚拟机 — jvm的运行时数据区
  • 操作数栈 and 局部变量区
  • 什么是操作数栈:
      与局部变量表一样,均以字长为单位的数组。不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。
      存储的数据与局部变量表一致含int、long、float、double、reference、returnType,操作数栈中byte、short、char压栈前**(bipush)会被转为int。
      数据运算的地方,大多数指令都在操作数栈弹栈运算,然后结果压栈。
      java虚拟机栈是方法调用和执行的空间,每个方法会封装成一个栈帧压入占中。其中里面的操作数栈用于进行运算,当前线程只有当前执行的方法才会在操作数栈中调用指令
    (可见java虚拟机栈的指令主要取于操作数栈)。**
      int类型在-15、-128127、-3276832767、-21474836482147483647范围分别对应的指令是iconst、bipush、sipush、ldc (这个就直接存在常量池了)
  • 原文链接:https://blog.csdn.net/qq_28666081/article/details/85269879

题目分析(行分解)

  1. int i = i++;
    运算流程:
      首先理解,赋值运算,等号右侧先计算,再赋值;
      同时,i++ 中++ 后算;所以:
       1)将要操作数i的值(1)压入(iconst)操作数栈;
       高频面试题--自增系列_第1张图片
       2)i++ 开始计算,导致局部变量变为 2;
       高频面试题--自增系列_第2张图片
       3)到此为止只是对等号右侧进行了计算,接下来做赋值预算,即:将操作数栈中的值(1)赋值给局部变量中的(i);局部变量遭到覆盖,所以 i 的值变为 1 ;
       高频面试题--自增系列_第3张图片
  2. int j = i++;
    前面得到 :此时 i = 1 ; 《计算原理相同》
    等号右侧:i 压入操作数栈顶,之后进行++;此时 i = 2;赋值给局部变量 j ;
    所以:j = 1; i = 2;
    高频面试题--自增系列_第4张图片
    高频面试题--自增系列_第5张图片
  3. int k = i + ++i * i++;
      前面得到 i = 2 ;《计算原理相同》
    等号右侧:
     首先 i 压入操作数栈顶;
    高频面试题--自增系列_第6张图片
     然后 ++i (++i 先运算++ 所以 i =3 局部变量 i +1 =3)得到 i = 3 压入操作数栈顶 ;
    高频面试题--自增系列_第7张图片
     最后 i++(i++ ; ++ 后运算,) 得到 i = 3 ; 压入操作数栈顶,接着对 ++ 进行计算,局部变量 i + 1 = 4;
    高频面试题--自增系列_第8张图片
      接着进行计算,先运算操作数栈中前两个弹出 求乘积 3*3=9 , 之后再将结果(9)压入操作数栈,再进行加法计算 2+ 9 =11 , 并赋值给 k ;

i = 4 ;j = 1 ; k = 11;

查看main方法字节码文件  -- 理解执行流程

高频面试题--自增系列_第9张图片

  • iconst_1 : 数值3压入操作数的栈顶 (范围-1~5,即用指令iconst) --压栈
  • istore_1 [i] : 从栈顶弹出并压入局部变量表访问索引为1的Slot – 弹栈入局部变量表
  • iload_1 [i] : 将局部变量表中访问索引为1的Slot重新压入栈顶 – 局部变量表入栈
  • iinc 1 1 [i] : 自增运算
  • 以此类推;

小结

  • 赋值 = , 最后计算
  • = 右边的从左到右加载值一次压入操作数栈
  • 实际先算哪个,看运算符优先级
  • 自增、自减操作哦都是直接修改变量的值,不经过操作数栈
  • 最后的赋值之前,临时结果也是存储在操作数栈

你可能感兴趣的:(高频面试题)