输出以下Java代码的原因是什么?

时间:2012-02-07 04:39:29

标签: java

  

可能重复:
  Integer wrapper objects share the same instances only within the value 127?
  Why is == true for some Integer objects?

class One
{
    public static void main(String[] args) 
    {
           Integer i1 = 10;
           Integer i2 = 10;

        if (i1 == i2) 
        {
            System.out.println("In if ");
        } 
        else
        {
            System.out.println("in else");
        }
    }
}

上述程序的输出为In if 但如果i1和i2的值更改为1000,则输出为In else。

我知道autoboxing正在这里发生,但无法理解输出的原因。 谢谢!

3 个答案:

答案 0 :(得分:4)

如果两个操作数都引用同一个实例,则

==仅返回true。

在第二种情况下,它们返回false,因为它们不是同一个实例。 (与您无法将字符串与==进行比较的原因相同)

但在第一种情况下,运行时实际上会将Integer个对象缓存为小值。因此,i1i2指向相同的缓存对象。

答案 1 :(得分:1)

==检查两件事是否是同一个对象;

通常,当将基元类型装入包装类型时,JVM会分配内存并创建新对象。但是对于某些特殊情况,JVM会重用相同的对象。

以下是存储为不可变对象的基元列表:

  • 布尔值为true和false

  • 所有字节值

  • 介于-128和127之间的短值

  • 介于-128和127之间的int值

  • 在\ u0000到\ u007F

  • 范围内的字符

参考http://today.java.net/pub/a/today/2005/03/24/autoboxing.html#immutable_objects

答案 2 :(得分:0)

==正在比较对象(地址,如果你愿意,但不是真的)

尝试

  if (i1.equals(i2))