例:
int a = 0, i = 0;
while(i < 10){
i++;
a = a++;
}
System.out.println(a); //a = 0
我们知道方法执行时,jvm底层会分配一个内存给这个方法,这个内存称为栈帧(main),栈帧里面又分槽(slot)和操作栈。现在进入while循环,首先读取运行时常量池中的a放入槽中,当运行到a = a++时:
- 先执行 a++:
- 先把槽中a放入操作栈里(操作栈里的:a = 0)
- 槽里的a自增1(槽里:a = 1)
- 再执行 a = 赋值:
- 即操作栈里a = 0 放回 槽中时 会把槽里的(a = 1)覆盖掉
- 即 a = a++ 第一次循环完 a还是为0
- 直到i 自增到10退出循环
int a = 0, i = 0;
while(i < 10){
i++;
a = ++a;
}
System.out.println(a); //a = 10
这里与上面就差一步即 2和3是反过来的
- a先在槽里自增1(a = 1)
- 再把a(此时 a = 1)压入操作栈中
int a = 0, i = 0;
while(i < 10){
i++;
++a; //a++
}
System.out.println(a); //a = 10
这里不管是a++或者++a 都没有影响,因为即使a压入操作栈中,但是最后没有赋值,即操作栈不管是不是增1,都不会覆盖槽里的自增,所以最后a一直增到10,通俗来讲没有操作(=或+或-等),使得操作栈里面的a没有作用了。
//测试一下这题
int a = 10;
int b = a++ + ++a + a--;
System.out.println(a); //a = 34
- a++:槽 a1 = 11 ,操作栈 a1 = 10
- ++a: 操作栈a1 -> a2 a2 = 12 ,槽 a2 = 12
- +:a1 + a2 = 22
- a–:槽 a2 -> a3 a3 = 11,操作栈 a2 = 12
- +:22+a2=34
- =:b = 34
- 相当于最后槽里执行了a–并没有被用到
思考:发现在做题时,++a 比 a++ 明显速度更快,内存用的也更少,或许是++a 没有进入操作栈,节省了时间和空间