用equals方法测试Java对象的相等性

问题描述

我想问一个有关使用equals方法测试Java对象相等性的问题。

我是Java的初学者,目前正在学习Dummies Java 9合1书。

我编写了以下代码来检查两个Employee对象的相等性

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,但我想澄清完成情况。

解决方法

lastNameString,因此调用this.lastName.equals(emp.getLastName())将使用Stringequals方法的实现。当然,名字的比较也是如此。

,

基本上,您覆盖了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;
    }

希望这很有帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...