面试官:你真的清楚 i = i++和 i = ++i 的区别吗?

    技术2022-07-11  71

    为面阿里P8,我肝了一份651个技术分支的脑图,要么?(限时领)

    写在前面:前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛…

    直到遇到了这道题目。说句实话,曾经自己做这种运算题目,完全是靠脑子空想,然后拿上笔颤抖的写下一个自己都不知道正不正确的答案。不过过了今天,我终于能确定它的答案了。

    为此,我也专门写一篇博客,记录我的学习!!!

    1、题目

    package pers.mobian.questions01; public class test01 {     public static void main(String[] args) {         int i = 1;         i = i++;         int j = i++;         int k = i + ++i * i++;         System.out.println("i="+i);         System.out.println("j="+j);         System.out.println("k="+k);     } }

    你能肯定并且准确的说出你的答案吗?

    2、分析

    在做这道题时我们的脑中要有对应的JVM内存结构。其中一个方法对应一个栈帧

    此题目我们只需要用到栈帧里面的局部变量表和操作数栈

    2.1、第一步

    int i = 1

    只是一个简单的赋值操作

    2.2、第二步

    i = i++

    结果:i还是等于1

    2.3、第三步

    int j = i++

    结果:i在局部变量表中变成了2,操作数栈中的 i 值为1,并且将 i 的值返回给 j,即此条语句以后,i = 2,j = 1

    2.4、第四步

    int k = i + ++i * i++

    结果:局部变量表中的i = 4,k = 11

    2.5、结果

    3、i = ++i

    按理说根据上面的分析过程,再来分析 i = ++i,就很简单了。

    我们的 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈中的数据返回给我们的变量 i 。

    public class test02 {     public static void main(String[] args) {         int i = 1;         i = ++i;         System.out.println(i); // 结果:i = 2     } }

    最后的最后:本文的思考过程和计算推导仅针对Java语言

    Processed: 0.024, SQL: 9