10

任何机构都可以向我解释输出中发生了什么。如果 == 用于比较两个 ref。如果创建静态方法 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

4 回答 4

11

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

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

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 等原语,您可以使用==比较器。

于 2012-10-13T07:51:28.483 回答
3

因为Integer.valueOf维护从-128到的整数缓存127

这是您的源代码,您可以清楚地valueOf看到如果 Integer 值介于-128127

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

所以你的==回报是真的。如果 value 大于那个值,那么它总是会返回 false。

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

您应该始终使用equals方法检查相等性

ee.equals(ff);

如果您在下面添加另一个 if

    if (ee.equals(ff))
        System.out.println("ee equals ff");

输出将是

 ee equals ff
于 2012-10-13T07:51:46.390 回答
1

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

于 2012-10-13T07:54:05.530 回答
1

new Integer("12")创建一个值为 12 的新 Integer 对象。无论您执行多少次,您每次都在创建一个全新的对象。这就是为什么==在第二种情况下不起作用。

JVM 为被认为更频繁使用的值(-128 - 127)维护 Integer 对象的缓存。Integer.valueOf("12")幕后做同样的事情(new Integer("12")),但在做之前,它会检查该缓存是否该值的对象已经存在于缓存中,如果存在,那么这就是它返回的内容,否则它会创建一个新的,将其添加到缓存并返回它。这就是为什么==在第一种情况下有效。

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

于 2012-10-13T08:01:03.037 回答