java:class Integer == operator奇怪的行为

时间:2013-10-06 04:56:43

标签: java eclipse

public class IntegerVsInt {

    public static void main(String args[])
    {
        int a = 1;
        int b = 1;
        int c = a + b;

        System.out.println(c);
        System.out.println(a == b);

        Integer x = 1;
        Integer y = 1;
        Integer z = x + y;

        System.out.println(z);
        System.out.println(x == y);
    }
}

在上面的代码中,我将比较两个int和两个integer类型的对象。

比较两个int的

a == b

我希望能比较他们的价值观。

然而,当你比较两个整数

x == y

我希望比较两个对象的地址,然后返回false。

我在两种情况下都是如此?为什么会出现这种情况?

2 个答案:

答案 0 :(得分:6)

==正在测试整数是否是同一个对象。在java中,需要缓存某些小值,并且可以选择缓存其他值,这就是== Object引用求值为true的原因。

JLS Spec 5.1.7

的摘录

如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的整数或短数,则让r1和r2为p的任意两次拳击转换的结果。始终是r1 == r2。

的情况

答案 1 :(得分:3)

x == y
由于整数缓存,

true-128之间的值为127

尝试

 Integer x = 130;
 Integer y = 140;

现在比较并看看魔术。

来自language spec

  

如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的整数或短数,则让r1和r2为p的任意两次拳击转换的结果。始终是r1 == r2。

的情况

<强>原因:

这种行为将是理想的行为,而不会造成过度的性能损失,特别是在小型设备上。可能会减少内存限制的实现。