0

请解决我对equals()的疑问。我认为 equlas() 检查内容,因此在下面的示例中它应该打印为 true,因为 t1 和 t2 的内容相同,但它打印的是 false。为什么?

public class Test {
        public static void main(String args[]) {
                Test1 t1 = new Test1(10);
                Test1 t2 = new Test1(10);
                System.out.println(t1.equals(t2));
        }
}

class Test1 {
        int a ;
        Test1( int x){
                a = x ;
        }
}

提前致谢

4

5 回答 5

2

您应该覆盖equals(),因为默认方法会比较引用。

下面的方法将正确比较两个对象。

public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Test1 other = (Test1) obj;
            if (a != other.a)
                return false;
            return true;
}
于 2013-08-28T16:41:17.863 回答
2

equals() 默认比较引用;并且两个不同对象(在本例中为t1t2)的引用是不相等的。您必须覆盖它以检查成员之间的相等性:

@Override
public boolean equals(Object o) {
    return (o instanceof Test1) && a == ((Test1)o).a;
}

作为一般规则,hashCode()无论何时覆盖都是一个好主意equals()

@Override
public int hashCode() {
    return a;
}
于 2013-08-28T16:41:42.677 回答
2

您需要equals在您的Test1类中覆盖以获得所需的行为。否则,该类将继承equalsObject,这仅确定两个引用是否引用同一个对象。在这里,您有不同的实例,false结果也是如此。

引用链接的 javadocs:

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true。

通常,您测试另一个对象是否属于同一类,然后比较各个字段是否相等。

于 2013-08-28T16:40:44.047 回答
1

您需要覆盖Test1类中的 equals 方法。也许是这样的:

public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Test1 other = (Test1) obj;
        if (a != other.a)
            return false;
        return true;
    }
于 2013-08-28T16:41:11.930 回答
0
@Override
public boolean equals(Object obj){

    if(!(obj instanceof Test))
         return false;

    return ((Test)obj).x == this.x;
}

在测试中覆盖equals()以检查x

于 2013-08-28T16:42:16.850 回答