java - 使用 == 和 != 的奇怪包装类行为

标签 java wrapper

<分区>

Possible Duplicate:
Weird Java Boxing

最近,当我阅读有关包装类的内容时,我遇到了一个奇怪的案例:

Integer i1 = 1000;
Integer i2 = 1000;

if(i1 != i2) System.out.println("different objects");

if(i1 == i2) System.out.println("same object");

打印:

different objects

Integer i1 = 10;
Integer i2 = 10;

if(i1 != i2) System.out.println("different objects");

if(i1 == i2) System.out.println("same object");

打印:

same object

这个案例有什么合理的解释吗?

谢谢

最佳答案

== 为第二种情况返回 true 的原因是因为包装器装箱的原始值足够小,可以在运行时保留为相同的值。因此它们是相等的。

在第一种情况下,Java 的整数缓存不够大,无法容纳数字 1000,因此您最终创建了两个不同的包装器对象,通过引用比较它们返回 false。

上述缓存的使用可以在Integer#valueOf(int)方法中找到(其中IntegerCache.high默认为127):

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

正如 Amber 所说,如果您使用 .equals() 那么这两种情况都会返回 true,因为它会在必要时将它们拆箱,然后比较它们的原始值。

关于java - 使用 == 和 != 的奇怪包装类行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4638023/

相关文章:

java - 包装类RAM

java - 处理 Future onSuccess 作为 Akka Actor 的回应

java - JVM如何创建抽象类的对象?

python - 如何用 Python 包装 CLI 程序(保持交互性)?

deep-learning - 在 OpenAI Gym 中使用跳帧包装器时,np.max 行的用途是什么?

c# - .NET 包装器到 C++ 代码 : CS0122 is inaccessible due to its protection level error

java - 通过转义字符解析 JSON 字符串

java - 如何使用 SpinnerDateModel

java - 应用程序在 Tomcat 服务器上找不到属性文件

java - YAJSW Java 服务包装器是否有 64 位 .dll 之类的东西?