Java 中的自动装箱不规则性:调查神秘的比较
Java 的自动装箱功能会自动将原始值转换为其相应的包装类对象。然而,当比较两个这样的对象时,会出现一种奇怪的行为。
考虑以下代码片段:
public class Scratch { public static void main(String[] args) { Integer a = 1000, b = 1000; System.out.println(a == b); // false Integer c = 100, d = 100; System.out.println(c == d); // true } }
输出让我们困惑:第一个比较产生 false,而第二个比较返回 true。为什么会这样?
揭开谜底
第二行输出是由Java语言规范(JLS)保证的。第 5.1.7 节规定,特定范围内的原始值(包括 -128 到 127 之间的整数)始终装箱到相同的对象中。
If the value p being boxed is ... an int or short number between -128 and 127, then ... r1 == r2.
这确保常用值始终装箱为不可区分的对象。
开头的歧义比较
相比之下,JLS 没有明确保证第一个比较。虽然规范允许实现在一定范围内缓存对象,但它并不强制执行。
因此,将较大整数作为对象进行比较的行为是特定于实现的。在这种情况下,运行时环境似乎为“a”和“b”分配了不同的引用,导致打印“false”。
结论
Java 的自动装箱提供了便利,但在比较某些原始值时也有一些怪癖。虽然定义范围内的值保证共享身份,但较大的整数可能会根据实现选择而表现不同。这些知识可以帮助我们避免意外行为并保持对 Java 中对象比较的控制。
以上是为什么 Java 的自动装箱在比较整数对象时会产生不一致的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!