📅  最后修改于: 2023-12-03 15:02:00.794000             🧑  作者: Mango
equals()方法是Java中常用的比较方法,用于比较两个对象是否相等。但是,由于Java中的一些特殊性质,equals()方法的实现往往需要考虑多种情况,否则会导致错误的比较结果。为了解决这个问题,Java提供了一种即时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()方法进行比较。