这个问题已经在这里有一个答案:
- 是什么在Java中==和equals()有什么区别? 22个回答
所述equals
方法比较两个对象值是否相等或没有。 我的问题是如何在两个对象进行比较? 它如何知道两个对象是否相等? 我想基于它的两个对象进行比较就知道了。 我不包括hashCode
方法。
这个问题已经在这里有一个答案:
所述equals
方法比较两个对象值是否相等或没有。 我的问题是如何在两个对象进行比较? 它如何知道两个对象是否相等? 我想基于它的两个对象进行比较就知道了。 我不包括hashCode
方法。
默认实现,这个类的一个java.lang.Object
,简单地测试指的都是同一个对象:
150 public boolean equals(Object obj) {
151 return (this == obj);
152 }
基准相等运算符在这样描述的Java规范 :
在运行时,如果操作数的值都为null或两者指代相同的对象或数组==的结果为真实的; 否则,结果是假的。
这种默认行为通常不是语义上的满足。 例如使用无法测试大整数实例平等==
:
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码equals
从被简单地比较的参照对象类方法e1
和e2
。 因此,它总是会给false
通过使用创建的每个对象new
关键字。
以下是从对象的方法摘要
public boolean equals(Object obj) {
return (this == obj);
}
为了比较平等检查JLS给了equals
方法在我们的类重写。 这不是最终的方法。 JLS不知道在什么基础上programmar想让两个对象相等。 于是他们给了非最终方法重写。
hashcode
不起作用检查对象的平等。 hashcode
检查/找到桶,其中对象是可用的。 我们使用hashcode
在哈希技术,它被某些类,比如HashMap中..
如果两个对象的hashCode都是不等于不意味着两个对象是相等的。
对于两个对象,如果equals
方法返回true,则哈希码必须相同。
你将不得不重写equals
方法来决定在此基础上,你要反对e1
和e2
在上面的代码是相同的。 是的基础上passportNumber
或socialSecurityNumber
或组合passportNumber+socialSecurityNumber
?
I want to know based on what it compares the two objects.
答案是,在默认情况下继承的帮助Object
类的equals
方法是通过使用==符号比较两个对象的引用相等。 代码上面给出。
从逻辑上讲,等于不比较对象(但你可以用它做任何事情),它比较值。 为对象比较有“==”运算