为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在Java中比较IntegerWrappers时128=128为false,而127=127

为什么在Java中比较IntegerWrappers时128=128为false,而127=127

萧十郎 2019-06-04 16:49:24
为什么在Java中比较IntegerWrappers时128=128为false,而127=127为真?class D {     public static void main(String args[]) {         Integer b2=128;         Integer b3=128;         System.out.println(b2==b3);     }}产出:falseclass D {     public static void main(String args[]) {         Integer b2=127;         Integer b3=127;         System.out.println(b2==b3);     }}产出:true注:-128至127之间的数字为真。
查看完整描述

3 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

在用Java编译数字文字并将其分配给Integer(大写)时I)编译器发出:

Integer b2 =Integer.valueOf(127)

使用自动装箱时也会生成这一行代码。

valueOf实现,使某些数字被“池”化,并且它返回小于128的值的相同实例。

来自java 1.6源代码,第621行:

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);}

价值high可以使用系统属性将其配置为另一个值。

-Djava.lang.Integer.IntegerCache.High=999

如果您使用该系统属性运行您的程序,它将输出true!

显而易见的结论是:永远不要依赖两种引用是相同的,总是将它们与之进行比较。.equals()方法。

所以b2.equals(b3)将为所有逻辑上相等的值b2,b3打印true。

注意,Integer缓存的存在并不是因为性能原因,而是为了与JLS,第5.1.7节;必须给出值的对象标识-128到127包含在内。

整数#值(Int)还记录了这种行为:

通过缓存频繁请求的值,此方法可能获得更好的空间和时间性能。此方法将始终将值缓存在范围-128至127(包括在内),并可能缓存此范围之外的其他值。


查看完整回答
反对 回复 2019-06-04
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

自动装箱缓存-128到127。这是在JLS中指定的(5.1.7).

如果值 p 装箱是true,false,一个字节,\u0000到\u007f范围内的一个字符,或者是-128到127之间的int或短数,那么让r1和r2是p的任意两个装箱转换的结果。在这种情况下,r1=r2。

处理对象时要记住的一条简单规则是-use.equals如果您想检查这两个对象是否“相等”,请使用=当您想要查看它们是否指向同一个实例时。


查看完整回答
反对 回复 2019-06-04
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

使用基本数据类型(INT),在这两种情况下都会产生预期的输出。

但是,由于您使用的是Integer对象,因此=操作符的含义有所不同。

在对象的上下文中,=检查变量是否引用同一个对象引用。

要比较对象的值,应该使用Eques()方法,例如。

 b2.equals(b1)

,它将指示b2是小于b1、大于还是等于(有关详细信息,请查看api)。


查看完整回答
反对 回复 2019-06-04
  • 3 回答
  • 0 关注
  • 784 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信