6

equals方法比较两个对象值是否相等。我的问题是它如何比较这两个对象?它如何判断两个对象是否相等?我想知道基于它比较两个对象的内容。我不包括该hashCode方法。

4

3 回答 3

6

默认实现,即 class 之一java.lang.Object,只是测试对同一对象的引用:

150    public boolean equals(Object obj) {
151        return (this == obj);
152    }

引用相等运算符在Java 规范中是这样描述的:

在运行时,如果操作数的值都为 null 或都引用同一个对象或数组,则 == 的结果为真;否则,结果为假。

这种默认行为通常在语义上并不令人满意。例如,您不能使用以下方法测试大 Integer 实例的相等性==

Integer a = new Integer(1000);
Integer b = new Integer(1000);
System.out.println(a==b); // prints false

这就是该方法被覆盖的原因:

722     public boolean equals(Object obj) {
723         if (obj instanceof Integer) {
724             return value == ((Integer)obj).intValue();
725         }
726         return false;
727     }

这可以实现:

System.out.println(a.equals(b)); // prints true

覆盖默认行为的类应基于标识字段(通常是所有字段)的相等性来测试语义相等性。

如您所知,您应该hashCode相应地覆盖该方法。

于 2013-03-21T08:36:11.243 回答
4

考虑以下示例,

public class Employee {
    String name;
    String passportNumber;
    String socialSecurityNumber;
    public static void main(String[] args) {
        Employee e1 = new Employee();
        Employee e2 = new Employee();
        boolean isEqual = e1.equals(e2);  // 1
        System.out.println(isEqual);
    }
}

在注释 //1 的代码中,它调用equals从 Object 类继承的方法,该方法只是比较e1和的引用e2。所以它总是会false为使用new关键字创建的每个对象提供。

以下是 Object 的方法摘录

public boolean equals(Object obj) {
    return (this == obj);
}

为了比较相等性检查,JLS 提供了equals在我们的类中覆盖的方法。这不是最终方法。JLS 不知道程序要在什么基础上使两个对象相等。所以他们给出了非最终方法来覆盖。
hashcode不检查对象的相等性。hashcode检查/查找对象可用的存储桶。我们hashcode在散列技术中使用,它被一些类使用,如 HashMap..

如果两个对象的哈希码相等,并不意味着两个对象相等。
对于两个对象,如果equals方法返回 true,则哈希码必须相同。

您将不得不重写equals方法来决定您想要对象的基础,e1并且e2在上面的代码中是相等的。是基于passportNumber还是socialSecurityNumber 结合passportNumber+socialSecurityNumber

I want to know based on what it compares the two objects.

答案是,默认情况下,在继承Object类的equals方法的帮助下,它使用 == 符号比较两个对象的引用相等性。上面给出了代码。

于 2013-03-21T09:18:45.140 回答
0

从逻辑上讲,equals 不比较对象(但是你可以用它做任何事情),它比较值。对于对象比较,有 '==' 运算符

于 2013-03-21T08:37:46.863 回答