📜  Java中的即时 equals() 方法和示例(1)

📅  最后修改于: 2023-12-03 15:02:00.794000             🧑  作者: Mango

Java中的即时equals()方法和示例

equals()方法是Java中常用的比较方法,用于比较两个对象是否相等。但是,由于Java中的一些特殊性质,equals()方法的实现往往需要考虑多种情况,否则会导致错误的比较结果。为了解决这个问题,Java提供了一种即时equals()方法,也叫快速失败策略,可以避免由于对象类型不同或空指针引起的比较错误。

即时equals()方法的使用

即时equals()方法的定义如下:

public static boolean equals(Object a, Object b) {
   return (a == b) || (a != null && a.equals(b));
}

该方法首先判断两个对象是否为同一个对象(==操作符),如果是,则直接返回true;如果不是,则判断对象a是否为null,如果是,则返回false;如果不是,则调用a的equals()方法进行比较。

使用即时equals()方法的方式如下:

String s1 = "hello";
String s2 = null;
Objects.equals(s1, s2); // 返回false,因为s2为null

即时equals()方法使用了短路逻辑,只有在对象a不为null的情况下才会调用equals()方法进行比较,这可以防止NullPointerException异常的发生。

示例

下面给出一个示例,演示如何使用即时equals()方法比较两个Person对象:

import java.util.Objects;

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

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

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

    public static void main(String[] args) {
        Person p1 = new Person("张三", 20);
        Person p2 = new Person("李四", 25);
        Person p3 = new Person("张三", 20);

        // 传统的equals()方法
        System.out.println(p1.equals(p2)); // false
        System.out.println(p1.equals(p3)); // true

        // 即时equals()方法
        System.out.println(Objects.equals(p1, p2)); // false
        System.out.println(Objects.equals(p1, p3)); // true
    }
}

在该示例中,我们首先定义了一个Person类,该类具有name和age两个属性,以及equals()和hashCode()方法。然后我们定义了三个Person对象p1、p2和p3,分别进行比较。使用传统的equals()方法可以正确地比较p1和p3是否相等,但是使用该方法比较p1和p2时会返回false,因为它们不是同一个对象,但是使用即时equals()方法可以得到正确的比较结果。

总结

即时equals()方法可以避免由于对象类型不同或空指针引起的比较错误,使用该方法可以得到更加准确的比较结果。在实际的开发中,我们应该注意对象比较的细节,并使用适当的equals()方法进行比较。