老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

前些天看完了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内存结构。其中一个方法对应一个栈帧

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

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

2.1、第一步

int i = 1

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

只是一个简单的赋值操作

2.2、第二步

i = i++

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

结果:i还是等于1

2.3、第三步

int j = i++

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

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

2.4、第四步

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

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

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

2.5、结果

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

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面试题集合,附带超详细答案,希望能帮助到大家。先转发,转发,转发,然后添加小助手VX:xuanwo008即可领取。

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

需要资料的小伙伴,先转发,转发,转发,然后添加小助手VX:xuanwo008自取

原文 

https://juejin.im/post/5f02bf5a5188252e5e22d37c

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址