【问题标题】:Why don't java Integers point to the same memory location under if outside of Byte bounds? [duplicate]如果超出字节范围,为什么java整数不指向相同的内存位置? [复制]
【发布时间】:2018-05-14 21:31:16
【问题描述】:

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

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

这将输出true true。此外,我们可以将xy设置为10以外的其他数字;

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。但是如果我们将xy设置为-129,它们就不再指向同一个内存位置。

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

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

【问题讨论】:

    标签: java


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2012-08-06
    • 2019-05-18
    • 2012-11-04
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多