为什么在 Java 中比较 Integer 包装器时 128==128 为假而 127==127 为真?

新手上路,请多包涵
class D {
    public static void main(String args[]) {
        Integer b2=128;
        Integer b3=128;
        System.out.println(b2==b3);
    }
}

输出:

 false


 class D {
    public static void main(String args[]) {
        Integer b2=127;
        Integer b3=127;
        System.out.println(b2==b3);
    }
}

输出:

 true

注意:-128 到 127 之间的数字为真。

原文由 vipin k. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 401
2 个回答

当您在 Java 中编译数字文字并将其分配给整数(大写 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(含)的值提供对象标识。

Integer#valueOf(int) 也记录了这种行为:

通过缓存频繁请求的值,此方法可能会产生明显更好的空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并可能缓存此范围之外的其他值。

原文由 Andreas Petersson 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

如果 被装箱的值 p 是 true、false、字节、\u0000 到 \u007f 范围内的 char,或者 -128 到 127 之间的 int 或 short 数字,则令 r1 和 r2 为任意两次装箱转换的结果的页。 r1 == r2 总是这样。

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

原文由 Michael Lloyd Lee mlk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏