equals
方法是 Java 中用于比较两个对象是否“相等”的方法,属于 Object
类。因为所有类都直接或间接继承自 Object
,所以每个类都有 equals
方法。
以下是对 equals
方法的详细讲述:
1. equals
的定义
equals
方法定义在 java.lang.Object
类中:
public boolean equals(Object obj) {return (this == obj);
}
- 默认实现是比较两个对象的内存地址(引用地址),只有当两个引用指向同一个对象时才返回
true
。 - 通常会被子类(如
String
、Integer
等)重写,用于比较实际的值是否相等。
2. equals
的基本用法
(1)用于比较基本对象
Object obj1 = new Object();
Object obj2 = new Object();System.out.println(obj1.equals(obj2)); // 输出 false,因为它们是不同的对象。Object obj3 = obj1;
System.out.println(obj1.equals(obj3)); // 输出 true,因为它们是同一个引用。
(2)用于字符串比较
String
类重写了 equals
方法,用于比较字符串的内容是否相同:
String str1 = "hello";
String str2 = "hello";System.out.println(str1.equals(str2)); // 输出 true,内容相同。
(3)用于包装类比较
包装类(如 Integer
、Double
等)也重写了 equals
方法,用于比较值是否相等:
Integer num1 = 100;
Integer num2 = 100;System.out.println(num1.equals(num2)); // 输出 true,值相等。
3. equals
的使用场景
(1)基本对象的引用比较
如果没有重写 equals
,它默认比较引用地址是否相同。
(2)集合中的对象比较
在集合中,如 List
和 Set
,会使用 equals
方法来判断元素是否重复。例如:
Set<String> set = new HashSet<>();
set.add("A");
set.add("A");System.out.println(set.size()); // 输出 1,因为字符串 "A" 被认为是相等的。
(3)自定义类的值比较
对于自定义类,如果需要比较对象的内容,而非引用地址,通常需要重写 equals
方法。
4. 重写 equals
方法
(1)标准实现
在重写 equals
方法时,需要遵守以下规则:
- 自反性:
x.equals(x)
必须返回true
。 - 对称性:
x.equals(y)
与y.equals(x)
必须一致。 - 传递性:如果
x.equals(y)
和y.equals(z)
为true
,则x.equals(z)
也必须为true
。 - 一致性:多次调用
x.equals(y)
的结果必须一致。 - 与
null
比较:任何对象与null
比较必须返回false
。
(2)示例代码
假设有一个 Person
类,包含 name
和 age
两个字段,重写 equals
方法如下:
public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic 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.name);}
}
使用示例:
Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 25);System.out.println(p1.equals(p2)); // 输出 true,因为字段相同。
5. 与 ==
的区别
equals |
== |
---|---|
比较的是对象的内容(通常需要重写)。 | 比较的是对象的内存地址(引用地址)。 |
用于判断两个对象是否“值相等”。 | 用于判断两个引用是否指向同一个对象。 |
示例:
String str1 = new String("hello");
String str2 = new String("hello");System.out.println(str1 == str2); // 输出 false,不是同一个引用。
System.out.println(str1.equals(str2)); // 输出 true,内容相同。
6. equals
方法的注意事项
(1)比较时避免 NullPointerException
使用 equals
时,最好确保调用方不为空。如果不确定,可以使用常见的 常量在前
写法:
String str = null;
System.out.println("hello".equals(str)); // 输出 false,避免空指针异常。
(2)与 hashCode
一起重写
当重写 equals
方法时,通常也需要重写 hashCode
方法,否则可能导致集合操作出现问题。例如:
- 在
HashSet
或HashMap
中,equals
和hashCode
必须一致。
7. 常见实现类的 equals
行为
(1)String
类
比较字符串的内容:
String str1 = "hello";
String str2 = new String("hello");System.out.println(str1.equals(str2)); // 输出 true。
(2)Integer
类
比较数值是否相等:
Integer num1 = 100;
Integer num2 = 100;System.out.println(num1.equals(num2)); // 输出 true。
(3)ArrayList
和 HashSet
比较集合中的元素是否相等:
List<String> list1 = Arrays.asList("A", "B");
List<String> list2 = Arrays.asList("A", "B");System.out.println(list1.equals(list2)); // 输出 true。
总结
equals
方法用于判断两个对象是否相等,默认实现是比较引用地址。- 通常需要在自定义类中重写,用于比较实际值。
- 与
==
不同,equals
更适合用于值比较。 - 在集合框架中广泛应用,需要与
hashCode
方法配合重写以保证一致性。