只需要一些关于.equals的启示

时间:2014-04-14 12:46:07

标签: java equals

Integer a = new Integer(1);
Integer b = new Integer(1);
Long c = new Long(1);

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

问题是为什么a.equals(c)给出了错误?

6 个答案:

答案 0 :(得分:5)

来自Integer.equals()

  

当且仅当参数不是true并且是包含与此对象相同的int值的null对象时,结果为Integer

c不是Integer,因此a.equals(c)会返回false

答案 1 :(得分:2)

因为,您正在使用Integer类的equals方法,该方法如下:

public boolean equals(Object obj) {
        if (obj instanceof Integer) { 
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

此处的条件失败if (obj instanceof Integer),因为您的案例中的cLong的实例。

答案 2 :(得分:0)

因为两个对象不是同一个Class,一个是Integer而另一个是Long,所以当您说.equals()

时,它不仅会比较值

答案 3 :(得分:0)

Integer(和大多数类)的等于从检查参数的类是否等于对象自己的类开始。如果不是,则equals将返回false。如果您尝试在整数和字符串之间调用equals,则更有意义,它们无法在值上与整数和long相同的方式进行比较。因此,所有非整数且在整数对象上调用equals的类都将返回false。

答案 4 :(得分:0)

如果你看一下Integer.equales(Object obj)的来源,你就会明白为什么:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

Long不是Integer的实例。

答案 5 :(得分:0)

简而言之:因为c不是Integer对象。您正在调用Integer#equals(Object)并传递Long作为参数。 Integer#equals(Object)的源代码是:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

由于objLong而不是Integerif (obj instanceof Integer)检查失败,然后方法会返回false