详解Java的equals(Object obj)方法:判断当前对象是否和给定对象相等

  • Post category:Java

Java中的equals(Object obj)方法是用于比较两个对象的内容是否相等的方法。它是基类Object中定义的方法,因此所有Java类都可以使用该方法进行比较,但需要注意的是,如果子类希望使用该方法进行比较时,需要重写该方法以满足自己的需求。

equals方法的定义

该方法的定义如下:

public boolean equals(Object obj)

该方法接收一个对象作为参数,并将其与当前对象进行比较。如果两个对象的内容相等,则返回true,否则返回false

equals方法的默认实现

Java中的equals方法默认实现是使用==运算符进行比较,即比较两个对象的内存地址是否相同。例如,以下代码将返回false

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2));  // false

在上述代码中,str1str2是两个不同的字符串对象,虽然它们的内容相同,但由于它们的内存地址不同,因此按照默认实现会返回false

equals方法的重写

为了使equals方法按照我们自己的需求进行比较,我们需要对其进行重写。在进行重写时,我们需要满足以下几个条件:

  • 对称性:如果a.equals(b)返回true,则b.equals(a)也应该返回true
  • 自反性:对于任意的非空引用值xx.equals(x)总是应该返回true
  • 传递性:如果a.equals(b)返回trueb.equals(c)返回true,则a.equals(c)也应该返回true
  • 一致性:如果两个对象的内容没有发生变化,多次调用equals方法应该返回相同的结果。
  • 非空性:对于任意的非空引用值xx.equals(null)应该返回false

以下是一个重写equals方法的例子:

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

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;  // 先判断是否为同一对象
        if (!(obj instanceof Person)) return false;  // 再判断类型是否正确
        Person p = (Person) obj;
        return this.name.equals(p.name) && this.age == p.age;  // 最后比较属性是否相等
    }
}

在上述代码中,我们重写了equals方法,并在其中按照上述条件进行比较。其中利用了instanceof运算符来判断传入的对象是否与当前对象类型相同,避免了因为类型不同导致出现异常情况。

下面是一个使用该Person类的示例:

Person person1 = new Person("张三", 20);
Person person2 = new Person("张三", 20);
System.out.println(person1.equals(person2));  // true

在上述代码中,我们创建了两个Person类型的对象,并调用equals方法进行比较。由于它们的属性相同,因此将返回true

总结

通过本文的讲解,相信大家已经了解了equals方法的基本用法及其重写方式,可以自行根据具体需求进行修改,从而满足自己的比较需求。在实际开发中,要注意判断对象是否为null的情况,以避免出现空指针异常。