从面试题i = i++; 了解java内存模型
来源:互联网 发布:淘宝宝贝权重怎么看 编辑:程序博客网 时间:2024/06/11 06:17
先问大家一个问题:
int i = 0; i = i ++; System.out.print(i);// 结果为 0
int i = 0; int j = i ++; System.out.print(j);// 结果为 0 System.out.print(i);// 结果为 1
首先该代码在C/C++平台运行 结果是1 因为C/C++所有操作都是在内存中进行的,但是java有虚拟机的概念,虚拟机把内存分块详情见JAVA虚拟机内存详解, 虚拟机运行时 i++ 只改变本地变量表的值 操作栈顶的值还是0 赋值时候 i 从栈顶取出 还是 0
JAVA虚拟机栈描述的是JAVA执行的内存模型
每个帧栈都有局部变量表和操作数栈,在虚拟机眼里如何执行上述代码呢?
0:iconst_0 1:istore_1 2:iload_1 3:iinc 1,1 6:istore_1 7:iload_1
0 -> 将int类型的0入栈 放置到操作栈顶部
1 -> 将操作数栈栈顶的值0弹出,保存到局部变量表 index (索引)值为1的位置。(局部变量表也是从0开始的,0位置一般保存当前实例的this引用,当然静态方法例外,因为静态方法是类方法而不是实例方法)
2 -> 将局部变量表index 1位置的值的副本入栈。(这时局部变量表index为1的值是0,操作数栈顶的值也是0)
3 -> iinc是对int类型的值进行自增操作,后面第一个数值1表示,局部变量表的index值,说明要对此值执行iinc操作,第二个数值1表示要增加的数值。(这时局部变量表index为1的值因为执行了自增操作变为1了,但是操作数栈中栈顶的值仍然是0)
6 -> 将操作数栈顶的值弹出(值0),放到局部变量表index为1的位置(旧值:1,新值:0),覆盖了上一步局部变量表的计算结果。
7 -> 将局部变量表index 1位置的值的副本入栈。(这时局部变量表index为1的值是0,操作数栈顶的值也是0)
总结:从执行顺序可以看到,这里第1和第6执行了2次将0赋值给变量i的操作(=号赋值),i++操作是在这两次操作之间执行的,自增操作是对局部变量表中的值进行自增,而栈顶的值没有发生变化,这里需要注意的是保存这个初始值的地方是操作数栈而不是局部变量表,最后再将栈顶的值覆盖到局部变量表i所在的索引位置中去。
如果你理解了上面的 那么下面的题
int i = 0; i = i++ + i++; System.out.print(i) //是多少呢
i = 1 // 不解释了 上面看懂深入理解一下吧
- 从面试题i = i++; 了解java内存模型
- Java面试题之i=i++
- java面试题inti=2;i+=i-=i*i的值以及关于i++;++i;i=i+1;i+=1 的效率问题
- Java IO:了解I/O模型
- java面试题:i=i++和j=i++两句分别输出i=?,j=?
- 【JAVA面试题】i++,++i 的深刻理解
- i+1<i i-1>i java溢出问题;补码 反码 面试题
- 很有意思的面试题i++,++i
- C++面试题之i++面试题
- java I/O模型
- 从i=i+1, i++, ++i 区别引申到JAVA装箱与拆箱
- java i=i++
- 【那些年遇到过的面试题】阻塞 非阻塞 同步 异步 I/O 模型
- C语言面试题 unsigned int ,i?i, ab 交换
- C/C++面试题:i++与++i哪个效率更高?
- C/C++面试题:i++与++i哪个效率更高?
- 面试题讲解(二) i++与++i
- C++面试题: i++和++i的区别
- 算法总结与思考(开篇)
- PyQt5信号槽机制
- StringBuilder的用法
- 学习笔记-推荐系统(Recommender systems)
- Redis 散列(Hash)介绍与基本操作
- 从面试题i = i++; 了解java内存模型
- 打印菱形
- solution_229
- 4.Dijkstra单点最短路径算法 迪杰斯特拉
- 基于VideoView的自定义控制面板的视频播放器
- SpringMVC笔记(一)——请求流程
- 完全数
- 第六节第二大特性继承
- 543. Diameter of Binary Tree (二叉树)