微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决用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;
    }

希望这很有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。