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

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3汉化版
中文版,非常好用

Dreamweaver Mac版
视觉化网页开发工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器