3
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 和两个整数类型的对象。

当你比较两个 int 时

a == b

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

但是,当您比较两个整数时

x == y

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

我在这两种情况下都是正确的?为什么会出现这种行为?

4

2 回答 2

6

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

JLS Spec 5.1.7中的片段

如果被装箱的值 p 是真、假、一个字节或 \u0000 到 \u007f 范围内的一个字符,或者一个介于 -128 和 127(含)之间的 int 或短数字,则令 r1 和 r2 为p 的任意两个拳击转换。r1 == r2 总是如此。

于 2013-10-06T05:01:16.393 回答
3
x == y

用于整数缓存true 之间-128127 由于整数缓存的值。

尝试

 Integer x = 130;
 Integer y = 140;

现在比较一下,看看魔术。

语言规范

如果被装箱的值 p 是真、假、一个字节或 \u0000 到 \u007f 范围内的一个字符,或者一个介于 -128 和 127(含)之间的 int 或短数字,则令 r1 和 r2 为p 的任意两个拳击转换。r1 == r2 总是如此。

原因:

该行为将是理想的行为,不会造成过度的性能损失,尤其是在小型设备上。更少的内存限制实现可能。

于 2013-10-06T04:58:36.430 回答