equals方法如何在内部工作

时间:2019-01-16 17:39:18

标签: java

我有一个学生班,并且我重写了equals方法和哈希码。如何等于方法会在内部检查学生类型的所有对象。按照下面的代码,如何比较学生班级的所有实例(s1,s2,s3,s4)。代码实现正在比较此对象和插入的对象。根据我的理解,“ this”是指一个类的所有参考变量。但是如何不进行迭代就比较所有引用。

Student.java

public class Student {


    private String regNumber;

    public Student(String regNum) {

        this.regNumber=regNum;

    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((regNumber == null) ? 0 : regNumber.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {

        System.out.println("this "+this.getRegNumber());
        System.out.println("obj "+obj.toString());

        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (regNumber == null) {
            if (other.regNumber != null)
                return false;
        } else if (!regNumber.equals(other.regNumber))
            return false;
        return true;
    }

    public String getRegNumber() {
        return regNumber;
    }

    public void setRegNumber(String regNumber) {
        this.regNumber = regNumber;
    }

}

App.java

public class App {

    public static void main(String[] args) {
        Student s1 =new Student("A1");
        Student s2 =new Student("A2");
        Student s3 =new Student("A1");
        Student s4 =new Student("A1");
        Student s5 =new Student("A4");

        s1.equals(s1);

        HashMap<Student, String> studentMap=new HashMap<Student, String>();
        studentMap.put(s1, "bob");
        studentMap.put(s2, "mary");
        studentMap.put(s3, "eva");
        studentMap.put(s4, "rob");
        studentMap.put(s5, "alex");


        System.out.println(studentMap.size());



    }

}

1 个答案:

答案 0 :(得分:1)

首先,您需要首先了解为什么值得实施equals。当您对原始类型(例如整数)进行比较时,很明显如何比较它们。 Java不需要任何帮助来确定是否1==1。但是,对于一个像Student这样创建的类,java并不知道相等意味着什么。它唯一可以自行检查的是引用相等;也就是说,两个变量是否指向内存中的同一对象。但是,这通常无济于事,因此,我们必须编写自己的方法并通过检查每个对象的内部细节来定义两个对象何时相等。 (如果您已经知道所有这些,请您道歉,但不失为彻底)

似乎您的Student类将相等性定义为当两个Student对象具有相同的regNumber时为真。

让我们逐步了解它的作用:

    if (this == obj)
        return true;

this指的是对调用此方法的Student对象的当前实例的引用。换句话说,它不过是指向对象的指针。因此,此if语句正在执行以下检查:“如果此对象引用和传入的对象引用指向同一对象,则返回true。”实际上,这省去了比较它们内部任何细节的麻烦,因为如果两个对象通过引用相等,则它们必须相等。

    if (obj == null)
        return false;

非常自我解释。如果传入的其他对象引用为null,则可能无法等于该对象,因此返回false。

    if (getClass() != obj.getClass())
        return false;

此行基于类类型执行比较。因此,如果此对象(Student)与传入的对象不是同一类类型,则它们又不能相等,因此返回false。

    Student other = (Student) obj;
    if (regNumber == null) {
        if (other.regNumber != null)
            return false;
    } else if (!regNumber.equals(other.regNumber))
        return false;
    return true;

现在开始进行比较。首先,我们将传入的Object转换回Student类型。然后,比较每个对象的regNumber(首先确认两者都不是null来避免NullPointerException。如果它们不相等,则返回false,否则返回true。

请注意,如果要向Student添加更多字段,则就相等性而言它们将被忽略,除非您要在equals方法中添加一种考虑它们的方法。也就是说,字段不是“自动迭代通过的”,您必须手动并有意添加所有应视为与对象相等相关的字段。