打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
终于弄明白 i = i 和 i = i 的区别了!

作者:默辨

来源:https://urlify.cn/Abyuyy


写在前面:前些天看完了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    }}


为了能让大家有更好的面试资料去面试大厂的技术岗位,小编花费了2个多月的时间,把市面上的所有的Java面试题,做了一个归纳总结,整理了快200多页,够大家刷题好久了!

好了,废话不多说,本手册目前为第一版,内容有以下目录:Java基础面试题、集合、多线程、Java Spring、Spring AOP、pring Boot、SpringCloud、JVM、Mysql、Redis、MongoDB、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、Elasticsearch 、Kafka、Netty、Tomcat、Vue、React、JavaScript 等面试题 。

整个小册子目前50万字左右,部分截图:

好了,由于太多,暂时列举部分截图 。大家如果想要,直接使用以下方式获取高清PDF面试手册:

资料获取方法

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Java中的栈,堆,方法区和常量池
scjp认证套题解析(2)
四道Java基础题,你能对几道?
阿里最全面试100题:阿里天猫、蚂蚁金服、阿里巴巴面试题含答案
【Java面试题第一期】有没有jvm调优经验?调优方案有哪些?
一场IBM面试题引发的讨论:创建String对象过程中【内存分配】的终极权威详尽解释
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服