9

可能重复:
java 的 == 整数包装对象的不一致行为
仅在值 127 内共享相同的实例?

我发现 Integer 对象有以下 == 行为,但我无法理解。(我很清楚应该使用 equals 进行此类比较,但我正在为 OCPJP 学习......)

简而言之,== 对 1000 的预期效果,但对 10 无效。

之前的代码片段是:

Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different objects");
if(i1.equals(i2)) System.out.println("meaningfully equal");

它的行为与预期的一样:

different objects
meaningfully equal

后者虽然:

Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same object");
if(i3.equals(i4)) System.out.println("meaningfully equal"); 

具有以下输出:

same object
meaningfully equal

有人可以解释为什么会这样吗?

4

2 回答 2

12

从 Java 5 开始,引入了包装类缓存。以下是由位于 Integer 缓存中的内部类 IntegerCache 创建的缓存的检查。例如,以下代码将创建一个缓存:

Integer myNumber = 10

或者

Integer myNumber = Integer.valueOf(10);

在 -128 到 127 的范围内创建了 256 个 Integer 对象,它们都存储在 Integer 数组中。通过查看 Integer 中的内部类 IntegerCache,可以看到此缓存功能:

因此,当使用 Integer.valueOf 创建对象或直接将值分配给 -128 到 127 范围内的 Integer 时,将返回相同的对象。因此,请考虑以下示例:

Integer i = 100;
Integer p = 100;
if (i == p)  
    System.out.println("i and p are the same.");
if (i != p)
    System.out.println("i and p are different.");   
if(i.equals(p))
    System.out.println("i and p contain the same value.");

输出是:

i and p are the same.
i and p contain the same value.

需要注意的是,对象 i 和 p 只等于 true,因为它们是同一个对象,比较不是基于值,而是基于对象相等。如果整数 i 和 p 超出 -128 或 127 的范围,则不使用缓存,因此会创建新对象。在进行值比较时,请始终使用“.equals”方法。同样重要的是要注意,实例化 Integer 不会创建此缓存。

请记住,“==”总是用于对象相等,它没有被重载来比较未装箱的值

于 2012-02-17T11:22:42.990 回答
10

请参阅整数包装器对象仅在值 127 内共享相同的实例?. Integer 类为公共值保留共享的静态实例。

于 2012-02-17T11:15:43.910 回答