java integer常量池_为什么Integer常量池的行为在127发生变化?

不,数字常量池的工作方式不同于字符串。对于字符串,只保留编译时常量-而对于整数类型的包装器类型,如果任何装箱操作都适用于该值,则任何装箱操作都将始终使用该池。因此,例如:

int x = 10;

int y = x + 1;

Integer z = y; // Not a compile-time constant!

Integer constant = 11;

System.out.println(z == constant); // true; reference comparison

JLS保证池值的范围很小,但是实现可以根据需要使用更大的范围。

请注意,尽管不能保证,但是我看过的每个实现都可以Integer.valueOf用来执行装箱操作-因此,即使没有该语言的帮助,您也可以得到相同的效果:

Integer x = Integer.valueOf(100);

Integer y = Integer.valueOf(100);

System.out.println(x == y); // true

从JLS的5.1.7节开始:

如果装箱的值p为true,false,一个字节或介于\ u0000到\ u007f范围内的char或-128到127(含)之间的整数或短数,则令r1和r2为p的任何两次拳击转换。r1 == r2总是这样。

理想情况下,将给定的原始值p装箱将始终产生相同的参考。实际上,使用现有的实现技术可能不可行。以上规则是一种务实的妥协。上面的最后一个子句要求始终将某些通用值装在无法区分的对象中。该实现可以懒惰地或急切地缓存它们。对于其他值,此公式不允许对程序员方面的带框值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。

这样可以确保在大多数情况下,行为都是理想的,而不会造成不必要的性能损失,尤其是在小型设备上。例如,较少内存限制的实现可能会缓存所有char和short值,以及-32K到+ 32K范围内的int和long值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值