首页 > Java > java教程 > 为什么 Java 的自动装箱在比较整数对象时会产生不一致的结果?

为什么 Java 的自动装箱在比较整数对象时会产生不一致的结果?

Patricia Arquette
发布: 2024-12-27 18:46:15
原创
536 人浏览过

Why Does Java's Autoboxing Produce Inconsistent Results When Comparing Integer Objects?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板