在 Java 中,equals()
是 Object
类的方法,用于比较两个对象是否“相等”。这个方法可以被类重写(覆盖),从而定义自己类的相等判断标准。具体来说,equals()
方法通常用来比较两个对象的内容是否相同,而不仅仅是它们的内存地址(默认情况下,equals()
比较的是对象的引用地址,和 ==
运算符类似)。
equals()
方法的定义
equals()
方法在 Object
类中被定义,如下:
public boolean equals(Object obj) {
return (this == obj);
}
默认情况下,equals()
方法通过比较对象的内存地址来判断两个对象是否相等。因此,除非类重写了 equals()
方法,否则它的行为与 ==
操作符相同,即判断两个对象引用是否指向同一个内存位置。
equals()
方法的重写
为了比较对象的内容,我们通常会重写 equals()
方法。例如,对于一个表示“学生”的类,我们可能希望通过比较学生的 ID 来判断两个学生对象是否相等,而不是仅仅比较它们的内存地址。
示例:重写 equals()
方法
class Student {
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
// 重写 equals() 方法,比较学生对象的 id 和 name
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true; // 如果是同一个对象,直接返回 true
}
if (obj == null || getClass() != obj.getClass()) {
return false; // 如果传入的对象为 null 或者类型不同,返回 false
}
Student other = (Student) obj; // 类型转换
return this.id == other.id && this.name.equals(other.name); // 比较 id 和 name
}
@Override
public int hashCode() {
return id * 31 + name.hashCode(); // 通常重写 equals() 时,也要重写 hashCode()
}
}
示例:使用 equals()
方法
public class Test {
public static void main(String[] args) {
Student student1 = new Student(1, "Alice");
Student student2 = new Student(1, "Alice");
Student student3 = new Student(2, "Bob");
System.out.println(student1.equals(student2)); // true,id 和 name 都相同
System.out.println(student1.equals(student3)); // false,id 或 name 不相同
}
}
equals()
方法的使用规则
- 自反性:对于任何非空引用变量
x
,x.equals(x)
应该返回true
。 - 对称性:对于任何非空引用变量
x
和y
,x.equals(y)
应该与y.equals(x)
相同。 - 传递性:如果
x.equals(y)
为true
且y.equals(z)
为true
,那么x.equals(z)
也应该为true
。 - 一致性:如果
x.equals(y)
为true
,那么多次调用x.equals(y)
结果应该保持一致。 - 对于
null
的比较:x.equals(null)
应该返回false
。
为什么要重写 equals()
方法?
- 定制化比较:默认的
equals()
方法只是比较对象的引用地址,而不是对象的内容。在很多场景下,我们需要根据对象的属性来比较对象是否相等,重写equals()
方法可以实现自定义的比较逻辑。 - 集合操作:如
HashSet
和HashMap
这样的集合类依赖equals()
来判断对象是否已存在于集合中。没有正确重写equals()
方法时,集合可能无法正确地处理对象的去重和查找。
equals()
与 ==
的区别
==
运算符:用于比较两个对象的内存地址,判断两个对象是否引用同一个内存位置。equals()
方法:用于比较两个对象的内容,判断对象的状态(即其属性值)是否相同。equals()
是对象比较的方法,可以通过重写来定义内容比较的标准。
示例:equals()
vs ==
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false,str1 和 str2 是不同的对象
System.out.println(str1.equals(str2)); // true,str1 和 str2 的内容相同
在这个例子中,str1 == str2
返回 false
,因为 str1
和 str2
是两个不同的对象(虽然它们的内容相同),而 str1.equals(str2)
返回 true
,因为 String
类重写了 equals()
方法,比较的是字符串的内容。
小结
equals()
是 Java 中用于比较对象内容是否相等的方法,默认比较的是对象的内存地址。- 通常需要重写
equals()
方法来根据对象的属性来判断其是否相等。 equals()
方法的使用遵循一定的规则(如自反性、对称性等),并且它通常与hashCode()
方法一起重写,以保证在集合等场景中的正确性。
文档信息
- 本文作者:RuanChuangStudio
- 本文链接:https://ruanchuangstudio.github.io//2024/12/17/java-tips241217/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)