爲面阿里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語言