++a 和 a++ 的底层

例:

int a = 0, i = 0;
while(i < 10){
	i++;
	a = a++;
}
System.out.println(a); //a = 0

我们知道方法执行时,jvm底层会分配一个内存给这个方法,这个内存称为栈帧(main),栈帧里面又分槽(slot)和操作栈。现在进入while循环,首先读取运行时常量池中的a放入槽中,当运行到a = a++时:

  1. 先执行 a++:
  2. 先把槽中a放入操作栈里(操作栈里的:a = 0)
  3. 槽里的a自增1(槽里:a = 1)
  4. 再执行 a = 赋值:
  5. 即操作栈里a = 0 放回 槽中时 会把槽里的(a = 1)覆盖掉
  6. 即 a = a++ 第一次循环完 a还是为0
  7. 直到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
  1. a++:槽 a1 = 11 ,操作栈 a1 = 10
  2. ++a: 操作栈a1 -> a2 a2 = 12 ,槽 a2 = 12
  3. +:a1 + a2 = 22
  4. a–:槽 a2 -> a3 a3 = 11,操作栈 a2 = 12
  5. +:22+a2=34
  6. =:b = 34
  7. 相当于最后槽里执行了a–并没有被用到

思考:发现在做题时,++a 比 a++ 明显速度更快,内存用的也更少,或许是++a 没有进入操作栈,节省了时间和空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值