How does equals() method work in Java
equals方法比较两个对象值是否相等。我的问题是它如何比较这两个对象?它如何分辨这两个物体是否相等?我想知道基于它比较两个对象的结果。我不包括hashCode方法。
- 如果您需要比较对象,我建议您查看guava库对象助手:code.google.com/p/guava libraries/wiki/…
默认实现是类java.lang.Object中的一个,它只是测试引用是否指向同一对象:
1 2 3
| 150 public boolean equals (Object obj ) {
151 return (this == obj );
152 } |
参考等式操作符在Java规范中是这样描述的:
At run time, the result of == is true if the operand values are both
null or both refer to the same object or array; otherwise, the result
is false.
这种默认行为通常在语义上并不令人满意。例如,不能使用==测试大整数实例的相等性:
这就是该方法被重写的原因:
1 2 3 4 5 6
| 722 public boolean equals (Object obj ) {
723 if (obj instanceof Integer) {
724 return value == ((Integer)obj ). intValue();
725 }
726 return false;
727 } |
这使得:
1
| System. out. println(a. equals(b )); // prints true |
重写默认行为的类应该根据标识字段(通常是所有字段)的相等性测试语义是否相等。
如您所知,您应该相应地重写hashCode方法。
考虑下面的例子,
1 2 3 4 5 6 7 8 9 10 11
| 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 );
}
} |
在comment//1处的代码中,它调用了从对象类继承的equals方法,该方法只是比较e1和e2的引用。因此,它总是为使用new关键字创建的每个对象提供false。
下面是从对象中摘录的方法
1 2 3
| public boolean equals (Object obj ) {
return (this == obj );
} |
为了比较相等性检查,jls在我们的类中给了equals方法来重写。这不是最后的方法。JLS不知道Programmar希望在什么基础上使两个对象相等。所以他们给出了非最终方法来重写。hashCode不起到检验对象是否平等的作用。hashCode检查/查找对象可用的存储桶。我们在散列技术中使用hashCode,散列技术被一些类(如hashmap)使用。
如果两个对象的hashcode相等,这并不意味着两个对象相等。对于两个对象,如果equals方法返回true,那么hashcode必须相同。
您必须重写equals方法来决定您希望在上面代码中对象e1和e2是相等的。是基于passportNumber还是socialSecurityNumber还是passportNumber+socialSecurityNumber的组合?
1
| I want to know based on what it compares the two objects. |
答案是,默认情况下,借助继承的Object类的equals方法,使用==符号比较两个对象的引用相等性。上面给出了代码。
从逻辑上讲,equals不比较对象(但是您可以对它做任何事情),它比较值。对于对象比较,有"=="运算符
- 我不同意。等于比较对象的创建方式。正如反德罗伊所解释的,通常它比较价值,但不总是,也不总是所有的价值。例如,对于Entities Equals方法,通常只比较ID字段。
- 我提到"逻辑上"你可以做任何事。"equals"假设是"有意义地"比较对象,否则您可能没有对象的"=="。