【问题标题】:java == for Integer [duplicate]java == for Integer [重复]
【发布时间】:2012-03-08 18:57:47
【问题描述】:

可能重复:
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 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

谁能解释一下为什么会这样?

【问题讨论】:

  • BTW 尝试使用-XX:+AggressiveOpts,第一个将表现为第二个,因为它增加了整数缓存的大小。 ;)

标签: java integer ocpjp


【解决方案1】:

Integer wrapper objects share the same instances only within the value 127?。 Integer 类为公共值保留共享静态实例。

【讨论】:

    【解决方案2】:

    从 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 不会创建此缓存。

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

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2014-07-19
      • 2020-11-08
      • 2010-12-21
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 2023-03-26
      • 2011-07-10
      相关资源
      最近更新 更多