operator ==包装类对象上的不同行为

时间:2012-10-13 07:49:46

标签: java comparison integer equality

可以任何机构向我解释输出中发生的事情。 如果==用于比较两个ref。变量它只是检查它的引用是否相同然后它输入if body,那么为什么地狱 aa == bb是否等于如果使用new关键字创建其对象时,creting静态方法valueOf()和ee == ff不相等(这没关系)?

static void main(String args[])
{
    Integer aa = Integer.valueOf("12");
    Integer bb = Integer.valueOf("12");
    if(aa==bb)System.out.println("aa==bb");
    if(aa!=bb)System.out.println("aa!=bb");
    Integer ee = new Integer("12");
    Integer ff = new Integer("12");


    if(ee==ff)System.out.println("ee==ff");
    if(ee!=ff)System.out.println("ee!=ff");
}

输出:

AA BB ==

EE!= FF

4 个答案:

答案 0 :(得分:11)

==比较器检查对象是否相等!

由于Integer.valueOf维护整数对象的缓存,其值为-128到127 valueOf(String),因此返回缓存的对象,因此==比较结果为true。

Integer a1 = new Integer("12");
Integer b1 = new Integer("12");
//a1 == b1 returns false because they point to two different Integer objects

Integer aa = Integer.valueOf("12");
Integer bb = Integer.valueOf("12");
//aa == bb returns true because they point to same cached object

对于对象值的比较,总是使用.equals方法,对于int,long等原语,你可以使用==比较器。

答案 1 :(得分:3)

因为Integer.valueOf维护从-128127的整数缓存

以下是valueOf的源代码,如果整数值介于-128127

之间,您可以清楚地看到它返回相同的对象
public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

所以你的==返回true。如果值大于该值,那么它将始终返回false。

    Integer aa = Integer.valueOf("1200");
    Integer bb = Integer.valueOf("1200");
    aa == bb --> false

您应该始终使用equals方法

检查相等性
ee.equals(ff);

如果您使用以下

添加另一个
    if (ee.equals(ff))
        System.out.println("ee equals ff");

输出

 ee equals ff

答案 2 :(得分:1)

对于ee和ff,在堆上创建了Integer的两个对象,因此它们都引用了不同的对象,因此在使用==运算符时它们不相等。

答案 3 :(得分:1)

new Integer("12")创建一个值为12的新Integer对象。无论您多久这样做,您每次都要创建一个全新的对象。这就是==在第二种情况下不起作用的原因。

JVM维护Integer对象的缓存,以获取被认为更频繁使用的值(-128-127)。场景后面的Integer.valueOf("12")执行相同的操作(new Integer("12")),但在执行此操作之前,它会检查该缓存中是否该对象已存在于缓存中,如果确实存在则返回该内容,否则它会创建一个新的,将其添加到缓存并返回它。这就是==在第一种情况下起作用的原因。

此外,对于对象,==永远不应该用于相等性检查,而应该仅用于身份检查(例如,查看两个不同的变量是否指向同一个对象)。对于等式检查,请始终使用equals方法。