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 许可协议
当您在 Java 中编译数字文字并将其分配给整数(大写
I
)时,编译器会发出:当您使用自动装箱时,也会生成这行代码。
valueOf
的实现使得某些数字被“合并”,并且它为小于 128 的值返回相同的实例。来自 java 1.6 源代码,第 621 行:
high
的值可以使用系统属性配置为另一个值。如果您使用该系统属性运行您的程序,它将输出 true!
显而易见的结论:永远不要依赖两个相同的引用,始终将它们与
.equals()
方法进行比较。所以
b2.equals(b3)
将为 b2,b3 的所有逻辑相等值打印 true。请注意,
Integer
缓存不存在是出于性能原因,而是为了符合 JLS,第 5.1.7 节;必须为 -128 到 127(含)的值提供对象标识。Integer#valueOf(int) 也记录了这种行为: