点击上方“ 搜云库技术团队 ”关注,选择“ 设为星标 ”
回复“ 面试题 ”领 《96份:3265页面试题》
来源: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
}
}
最后的最后:本文的思考过程和计算推导仅针对Java语言
《第2版:互联网大厂面试题》
最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,索性,我就把我看过的和我面试中的真题,及答案都整理好, 整理了 《第2版:互联网大厂面试题》 并 分类 92 份 PDF , 累计 3625页! 我会持续更新中,马上就出第三版,涵盖大厂算法会更多!
第2版:题库非常全面
包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!
第2版:面试题,怎么领取?
扫码关注, 我另一个公众号 , 架构师专栏
(对,就是我小号)
没错,扫码关注,即可下载
(这是神奇的二维码,你不用回复关键字)
原文
http://mp.weixin.qq.com/s?__biz=MzA3MTUzOTcxOQ==&mid=2452972424&idx=2&sn=4912a05f204d82cca30baa611a1d7db8
本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 终于弄明白 i = i++和 i = ++i 了,图文并茂!