equals作用

equals()的作用是用来判断两个对象是否相等

源码来源于 JDK 11.0.10

// 定义于 Object 类
public boolean equals(Object obj) {
return (this == obj);
}

​ 因为equals()定义于 Object 类中,所以所有的 Java 类都会实现该方法。即所有的类都可以通过equals()对两个对象进行比较。在上述源码中可以看到,默认的equals()方法就是实现的 ==操作,即比较两个对象地址是否相同。

由此可将所有的 Java 类分为两类:

  1. 覆盖equals()方法:用自定义的方法来判断两个对象是否相等。通常覆盖的选择为,判断两个对象的内容是否相等,如果相同返回 true ,否则,返回 false;
public class Test01 {
public static void main(String[] args) {
Student s1 = new Student("Tom", 10);
Student s2 = new Student("Tom", 10);
System.out.println(s1.equals(s2));
}

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

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

public String toString() {
return name + " " + age;
}
}
}

// 运行结果
// false 由于没有覆盖 equals 方法,默认判断是否为同一个对象,所以结果为 false
  1. 不覆盖equals()方法:这里不覆盖方法,即执行==操作,判断两个对象是否为同一个对象。
public class Test01 {
public static void main(String[] args) {
Student s1 = new Student("Tom", 10);
Student s2 = new Student("Tom", 10);
System.out.println(s1.equals(s2));
}

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

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

public String toString() {
return name + " " + age;
}

@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}

if (this == obj) {
return true;
}

if (this.getClass() != obj.getClass()) {
return false;
}

Student stu = (Student) obj;
return name.equals(stu.name) && age == obj.age;
}
}
}

// 运行结果
// true 覆盖 equals 方法,自定一判断 Student 对象内容中的 name 和 age 是否相同,所以结果为 true

总结

==equals()区别:

  • 前者是判断两个对象的地址是否相等(两个对象是否为同一个对象);
  • 后者分为两种情况:
    • 不覆盖equals()方法:等价于 ==
    • 覆盖equals()方法:根据自定义的覆盖规则进行判断两个对象是否相等,通常用于判断两个对象的内容是否相等。