java - 如果超出字节范围,为什么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
。但是如果我们设置x
and y
to -129
,它们就不再指向同一个内存位置。
Integer x = -129;
Integer y = -129;
out.println(x.equals(y) + " " + (x==y));
这输出true false
,一个非常有趣的方面。我不知道为什么Integer
's 如果超出范围会指向不同的内存位置Byte
,我希望有人可以对这个主题有所了解。
解决方案
据我所知,现代 JVM 实现对于从 -128 到 +128 的所有整数都有“单例实例”,类似于内部化字符串;无论您是否想要它们,它们都始终存在于堆中。因此,将 int 5 装箱成 anInteger
不会返回新的 Integer 对象,而是返回值为 5 的 Integer 的“单例”实例。正如您所观察到的,装箱 129 将产生一个实际上是新的实例,因此如果您执行两次则==
返回。false
它仅适用于从 -128 到 +128 的盒装值,因为出于效率原因,这些值是引擎盖下的单例。
但是,我不确定这是任何语言或平台规范的一部分。它只是一个性能优化,一个实现细节。永远不要在你的代码中依赖它。equals()
在盒装课程上使用,==
即使它“似乎有效”也不要使用。
推荐阅读
- php - 带 AJAX 的验证码:JSON 数据的第 1 行第 1 列出现意外字符
- c - C将无符号字符数组转换为浮点数组
- javascript - 从不同的文件节点js导入
- algorithm - 分配具有投票选项的人的算法
- mysql - 从 Visual Studio 2017 连接到 MySql 数据库时出错?
- javascript - 无法在模板字符串中使用 forEach 函数进行输出
- python - python中发生跳转时优化组合中第二个选项的单位
- git - 从 git 历史记录中发现并删除所有已删除的文件
- bash - for 循环和符号链接点文件
- vb.net - 使用 CefSharp.WinForms 下载