等于没有返回预期o / p的方法

时间:2013-08-28 16:40:01

标签: java equals

请解决我对equals()的疑问。我认为equlas()会在以下内容中检查内容 例如,它应该打印为true,因为内容与t1和t1都相同 t2,但它打印错误。为什么呢?

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 ;
        }
}

提前致谢

5 个答案:

答案 0 :(得分:2)

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

从链接的javadocs引用:

  

类Object的equals方法实现最具辨别力   对象可能的等价关系;也就是说,对于任何非null   引用值x和y,当且仅当x时,此方法返回true   和y引用相同的对象(x == y的值为true)。

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

答案 1 :(得分: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;
}

答案 2 :(得分:2)

equals() by default比较引用;并且两个不同对象的引用(在这种情况下为t1t2)是不相等的。您必须覆盖它以检查成员之间的相等性:

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

作为一般规则,每当您覆盖equals()时覆盖hashCode()是个好主意:

@Override
public int hashCode() {
    return a;
}

答案 3 :(得分: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;
    }

答案 4 :(得分:0)

@Override
public boolean equals(Object obj){

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

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

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

的值