equals
方法比较两个对象值是否相等。我的问题是它如何比较这两个对象?怎么能告诉两个对象是否相等?我想知道它基于它比较两个对象。我不包括hashCode
方法。
答案 0 :(得分:6)
默认实现,即类java.lang.Object
之一,只是测试引用是否属于同一个对象:
150 public boolean equals(Object obj) {
151 return (this == obj);
152 }
引用相等运算符在Java Specification:
中的描述如下在运行时,如果操作数值都是,则==的结果为真 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
方法。
答案 1 :(得分: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的代码中,它调用Object类中的继承equals
方法,该方法只是比较e1
和e2
的引用。因此,对于使用false
关键字创建的每个对象,它总是会new
。
以下是Object
中的方法摘录public boolean equals(Object obj) {
return (this == obj);
}
为了比较相等性检查,JLS在我们的类中使用了equals
方法来覆盖。这不是最终方法。 JLS不知道programmar想要使两个对象相等的基础。所以他们给出了非最终方法来覆盖
hashcode
不起作用来检查对象的相等性。 hashcode
检查/找到对象可用的Bucket。我们在散列技术中使用hashcode
,这些技术被HashMap等一些类使用。
如果两个对象的哈希码相等,则表示两个对象相等。
对于两个对象,如果equals
方法返回true,则hashcode必须相同。
您必须覆盖equals
方法以确定您希望对象e1
和上述代码中的e2
相等的基础。是基于passportNumber
还是socialSecurityNumber
还是passportNumber+socialSecurityNumber
的组合?
I want to know based on what it compares the two objects.
默认情况下,答案是在继承的Object
类equals
方法的帮助下,它使用==符号比较两个对象的引用相等性。代码如上所示。
答案 2 :(得分:0)
逻辑上,equals不比较对象(但是你可以用它做任何事情),它会比较值。对于对象比较,有'=='运算符