equals()方法如何在Java中工作

equals方法比较两个对象值是否相等。 我的问题是如何比较这两个对象? 怎么能告诉两个对象是否相等? 我想知道它基于它比较两个对象。 我不包括hashCode方法。

默认实现,类java.lang.Object ,只是测试引用是否属于同一个对象:

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

引用相等运算符在Java规范中如下所述:

在运行时,如果操作数值都为null或者两者都引用相同的对象或数组,则==的结果为true; 否则,结果是错误的。

此默认行为通常在语义上不令人满意。 例如,您无法使用==测试大型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方法。

考虑以下示例,

 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的代码中,它调用Object类中的inherited equals方法,它只是比较e1e2引用。 因此,对于使用new关键字创建的每个对象,它总是会给出false

以下是Object的摘录方法

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

为了比较相等性检查,JLS在我们的类中给出了equals方法来覆盖。 这不是最终方法。 JLS不知道programmar想要使两个对象相等的基础。 所以他们给出了非最终方法来覆盖。
hashcode不起作用来检查对象的相等性。 hashcode检查/找到对象可用的Bucket。 我们在散列技术中使用hashcode ,哈希hashcode等一些类使用hashcode函数。

如果两个对象的hashcode等于,则表示两个对象相等。
对于两个对象,如果equals方法返回true,则hashcode必须相同。

您将必须重写equals方法以确定您希望在上面的代码中对象e1e2相等的基础。 它是基于passportNumber还是socialSecurityNumber还是passportNumber+socialSecurityNumber的组合?

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

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

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