首页 > 解决方案 > 如果超出字节范围,为什么java整数不指向相同的内存位置?

问题描述

那么这个有趣的问题今天出现了,在 Java 中,如果两个Integer' 被初始化为相同的值,Java 将使它们指向相同的内存位置(我假设是为了节省内存)。

Integer x = 10;
Integer y = 10;
out.println(x.equals(y) + " " + (x==y));

这将输出true true. 此外,我们可以设置10x以外y的其他数字;

Integer x = -128;
Integer y = -128;
out.println(x.equals(y) + " " + (x==y));

Integer x = 127;
Integer y = 127;
out.println(x.equals(y) + " " + (x==y));

而这些也会输出true true。但是如果我们设置xand yto -129,它们就不再指向同一个内存位置。

Integer x = -129;
Integer y = -129;
out.println(x.equals(y) + " " + (x==y));

这输出true false,一个非常有趣的方面。我不知道为什么Integer's 如果超出范围会指向不同的内存位置Byte,我希望有人可以对这个主题有所了解。

标签: java

解决方案


据我所知,现代 JVM 实现对于从 -128 到 +128 的所有整数都有“单例实例”,类似于内部化字符串;无论您是否想要它们,它们都始终存在于堆中。因此,将 int 5 装箱成 anInteger不会返回新的 Integer 对象,而是返回值为 5 的 Integer 的“单例”实例。正如您所观察到的,装箱 129 将产生一个实际上是新的实例,因此如果您执行两次则==返回。false它仅适用于从 -128 到 +128 的盒装值,因为出于效率原因,这些值是引擎盖下的单例。

但是,我不确定这是任何语言或平台规范的一部分。它只是一个性能优化,一个实现细节。永远不要在你的代码中依赖它。equals()在盒装课程上使用,==即使它“似乎有效”也不要使用。


推荐阅读