在Java中使用实例解释equals()方法

在Java中使用实例解释equals()方法

在Java中,equals()方法用于比较两个对象是否相等。虽然在Java中每个对象都继承自Object类,因此默认情况下每个对象都有一个默认的equals()方法,但是如果我们希望两个对象相等的概念不仅仅是对象的指针相等,也可以是对象的属性相等,这时我们就需要在我们的自定义类中重载equals()方法。

重载equals()方法的一般原则

通常我们需要满足以下原则来为我们的自定义类重载equals()方法:

  1. 自反性:一个对象应该等于它本身。
  2. 对称性:如果a.equals(b)为真,那么b.equals(a)也应该为真。
  3. 传递性:如果a.equals(b)为真,b.equals(c)也为真,那么a.equals(c)也应该为真。
  4. 一致性:如果两个对象在任意时间都有相同的属性,那么它们应该一致地比较相等。(即,多次调用该方法,结果始终相同)。
  5. 非空性:任何一个对象不应该和null相等。

重载equals()方法的实现示例

下面我们来看一个简单的示例,来演示如何在一个自定义的类中重载equals()方法。

首先,我们创建一个名为Person的类,其中包含几个属性:姓名、年龄、性别。我们将在Person类中重载equals()方法,以使两个人的姓名、年龄、性别全部相同时,我们认为这两个人是相等的。

public class Person {
    private String name;
    private int age;
    private String gender;

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this)
            return true;
        if (!(obj instanceof Person))
            return false;
        Person other = (Person) obj;
        return this.name.equals(other.name)
                && this.age == other.age
                && this.gender.equals(other.gender);
    }

    // 同时重载hashCode()方法来与equals()方法一起使用
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + this.name.hashCode();
        result = 31 * result + this.age;
        result = 31 * result + this.gender.hashCode();
        return result;
    }
}

如上所示,我们重载了equals()方法,并在其中判断了传入的对象是否为Person类的实例,如果是,就比较两个Person对象的三个属性是否全部相等。

此外,我们还重载了hashCode()方法,因为在Java中,hashCode()方法和equals()方法一起使用可以提高程序性能,并且在使用HashMapJava集合类时也需要正确重载hashCode()方法。

接下来,我们可以编写测试类来测试上述类的equals()方法是否正确:

public class PersonTest {
    public static void main(String[] args) {
        Person p1 = new Person("Joe", 17, "Male");
        Person p2 = new Person("Joe", 17, "Male");
        Person p3 = new Person("Mike", 23, "Male");
        Person p4 = new Person("Joe", 18, "Male");
        Person p5 = new Person("Joe", 17, "Female");

        System.out.println("p1 equals p2: " + p1.equals(p2));
        System.out.println("p1 equals p3: " + p1.equals(p3));
        System.out.println("p1 equals p4: " + p1.equals(p4));
        System.out.println("p1 equals p5: " + p1.equals(p5));
    }
}

我们先创建了五个Person对象,然后通过equals()方法来比较它们是否相等。执行上述测试,我们会得到如下结果:

p1 equals p2: true
p1 equals p3: false
p1 equals p4: false
p1 equals p5: false

根据我们的实现,p1p2有相同的名字、年龄和性别,因此我们认为它们是相等的;而p3的名字、年龄和性别都和p1不同,因此我们认为它们是不等的。同理,p4p5也和p1不同。

使用Objects类中的equals()方法

除了在自定义的类中重载equals()方法之外,我们还可以使用Java 7中引入的Objects类中的equals()方法,它可避免因为调用null对象的方法而导致的空指针异常。下面是使用Objects类的示例:

import java.util.Objects;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this)
            return true;
        if (!(obj instanceof Student))
            return false;
        Student other = (Student) obj;
        return Objects.equals(this.name, other.name) && this.age == other.age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(this.name, this.age);
    }
}

如上所示,我们使用了Objects类的equals()hash()方法来替代了原来的name.equals(other.name)age == other.age

结论

通过上述例子的演示,我们可以总结出一些关于在Java中使用equals()方法的一些最佳实践:

  • 判断传入对象类型是否正确
  • 使用==比较对象是否相等,使用equals()比较对象内容是否相等
  • 重载hashCode()方法
  • 如果使用java.util包中的类(如List、Map、Set等),需要重载equals()hashCode()方法,以实现正确的对象比较和哈希值计算
  • 在Java 7中,推荐使用Objects类中的equals()hash()方法

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程