如何解决用equals方法测试Java对象的相等性
我想问一个有关使用equals方法测试Java对象相等性的问题。
我是Java的初学者,目前正在学习Dummies Java 9合1书。
public class TestEquality2 {
public static void main (String [] args) {
Employee emp1 = new Employee ("Martinez","Anthony");
Employee emp2 = new Employee ("Martinez","Anthony");
if (emp1.equals(emp2))
System.out.println("These employees are the same");
else
System.out.println("These employees are different.");
}
}
class Employee {
private String firstName;
private String lastName;
public Employee (String firstName,String lastName) {
this.lastName = lastName;
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public String getFirstName() {
return this.firstName;
}
public boolean equals (Object obj) {
// an object must equal itself
if (this == obj)
return true;
// no object equals null
if (this == null)
return false;
if (this.getClass() != obj.getClass())
return false;
// Cast to an employee,then compare the fields
Employee emp = (Employee) obj;
// is this the string's equals method?
return this.lastName.equals(emp.getLastName()) && this.firstName.equals(emp.getFirstName());
}
}
关注的焦点是equals(Object obj)
方法的最后一个。
根据代码,我已经覆盖了默认的Object equals ()
方法并提供了自己的设计,但是我对此感到困惑:
return this.lastName.equals(emp.getLastName()) && this.firstName.equals(emp.getFirstName());
我知道lastName
是一个字符串,但是我在这里使用的equals()
方法是equals()
的{{1}}方法还是我的那个方法?刚刚定义?如果是后者,我知道我会创建一个递归的情况,尽管我确信我正在使用String
,但我想澄清完成情况。
解决方法
lastName
是String
,因此调用this.lastName.equals(emp.getLastName())
将使用String
对equals
方法的实现。当然,名字的比较也是如此。
基本上,您覆盖了equals()方法,因为您希望在内存中拥有两个不同的对象,以便在您的应用程序中被视为相等,就像您创建两个不同的Employee类对象的情况一样,如下所示:
Employee emp1 = new Employee ("Martinez","Anthony");
Employee emp2 = new Employee ("Martinez","Anthony");
这些对象实际上是内存中的两个不同对象,或者从现实生活的角度来看,它们是两个不同的个体,如果不重写equals(),它将从具有以下实现的Object类中检查equals():
public boolean equals(Object obj) {
return (this == obj);
}
和emp1.equals(emp2)将返回false。
但是您的应用程序逻辑可能是您希望将这两个个体视为相等(相同),因此在这种情况下,您将覆盖equals()方法。
在覆盖相等时,您可以选择要使两个个人(雇员或对象)相等的基础,例如在您选择的情况下,您选择了firstName和lastName(也可以选择唯一的lastName,具体取决于您要求)。
因此,在下面的代码行中,基本上您是在说,如果两个雇员的firstName和surName相等,则即使您知道他们是两个不同的人(内存中的对象),也应将它们视为相等:
return this.lastName.equals(emp.getLastName()) && this.firstName.equals(emp.getFirstName());
为此,您要在名为Strings的lastName和firstName上调用String类的equals()。String类已经被Java库开发人员覆盖了equals()方法,如下所示:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value,aString.value)
: StringUTF16.equals(value,aString.value);
}
}
return false;
}
希望这很有帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。