整数构造变体

发布于 2024-11-04 20:37:19 字数 479 浏览 0 评论 0原文

大家好,我遇到了一个有趣的事件,正在寻找解释。

在 Java 1.6 中:

Integer a = new Integer(5);
Integer b = new Integer(5);

System.out.println(a == b);

Integer c = 5;
Integer d = 5;

System.out.println(c == d);

我得到:

false
true

在 Eclipse 中我签入了调试器。 ab 是不同的对象,而 cd 是相同的对象(但与 ab)。

谁能告诉我幕后发生的事情吗?这就是 JVM 的魔力吗?意识到 Integer(5) 已经在堆栈中了吗?

Hey all, I ran into an interesting occurrence and am looking for an explanation.

In Java 1.6:

Integer a = new Integer(5);
Integer b = new Integer(5);

System.out.println(a == b);

Integer c = 5;
Integer d = 5;

System.out.println(c == d);

I get:

false
true

In Eclipse I checked in the debugger. a and b are different objects, while c and d are the same objects (but different from a and b).

Can anyone clue me in on what's going on under the hood? Is this JVM magic? Realizing that a Integer(5) is already on the stack?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苯莒 2024-11-11 20:37:19

Java 会缓存它认为足够接近于零的值的 Integer 实例(如果它们是常量)。使用 new 手动创建 Integer 会绕过该缓存。您可以使用 int 调用 Integer.valueOf 来获取相应的 Integer,而无需绕过缓存。

您可能需要在您选择的搜索引擎上搜索“JVM 整数缓存”以获取更多信息。

Java caches Integer instances for values it deems close enough to zero if they're constants. Manually creating an Integer using new bypasses that cache. You can call Integer.valueOf with an int to get the corresponding Integer without bypassing the cache.

You may want to search for "JVM Integer cache" on your search engine of choice for more information.

灼疼热情 2024-11-11 20:37:19

@icktoofay 的回答很明确,但评论却把水搅浑了。

  • JLS 版本 3.0要求将 -128 到 +127 范围内的整数自动装箱为缓存值;请参阅 JLS 第 5.1.7 节。换句话说,对于所有兼容的 Java 5 及更高版本的平台,您可以依赖此行为来处理该范围内的整数。

    (类似的要求适用于布尔值、字节、字符和短整型。)

  • JLS 特别允许相同的自动装箱行为扩展到更广泛的值。

@icktoofay's answer nails it, but the comments are muddying the waters.

  • The JLS edition 3.0 requires that integers in the ranges -128 to +127 are autoboxed to cached values; see JLS section 5.1.7. In other words, you can rely on this behaviour for integers in that range, for all complaint Java 5 and later platforms.

    (Similar requirements apply to booleans, bytes, chars and shorts.)

  • The JLS specifically allows the same autoboxing behaviour to extend across a wider range of values.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文