equals()方法和==运算符都可以用于对象比较,但它们有一些区别。
运算符比较的是两个对象的引用是否相等,即判断两个对象是否指向内存中的同一个地址。如果两个对象的引用相等,那么运算符返回true;否则返回false。例如:
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
equals()方法比较的是对象的内容是否相等,即判断两个对象的值是否相等。equals()方法是Object类的方法,如果在子类中没有重写equals()方法,则默认继承Object类的equals()方法,这时equals()方法的行为与==运算符相同。但是,很多类(例如String、Integer等)都重写了equals()方法,使其具有比较内容的功能。例如:
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
在上面的例子中,虽然str1和str2是不同的对象,但它们的内容相等,因此equals()方法返回true。
需要注意的是,如果自定义的类中没有重写equals()方法,默认会使用Object类中的equals()方法,该方法与==运算符的行为是相同的,即比较引用是否相等。如果需要比较对象的内容,就需要在自定义类中重写equals()方法。
public class Person {
private String name;
private int age;
// 省略构造方法和其他方法
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age && Objects.equals(name, );
}
}
在上面的代码中,我们在Person类中重写了equals()方法,比较了name和age两个属性的值是否相等。为了避免空指针异常,我们使用了Objects.equals()方法来比较name属性,该方法会首先判断两个参数是否为null,如果都为null则返回true,如果有一个为null则返回false,如果都不为null则调用name的equals()方法进行比较。