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
方法,它只是比较e1
和e2
引用。 因此,对于使用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
方法以确定您希望在上面的代码中对象e1
和e2
相等的基础。 它是基于passportNumber
还是socialSecurityNumber
还是passportNumber+socialSecurityNumber
的组合?
I want to know based on what it compares the two objects.
答案是,默认情况下,在inheritance的Object
类的equals
方法的帮助下,它使用==符号比较两个对象的引用相等性。 代码如上。
从逻辑上讲,equals不会比较对象(但是你可以对它做任何事情),它会比较值。 对于对象比较,有’==’运算符