Java中的hashCode()
和equals()
方法以及==
操作符在比较对象时各有不同的用途和实现机制,具体区别如下:
-
== 操作符:
- 基本数据类型:比较的是它们的实际值是否相等。
- 对象引用:比较的是对象的内存地址,即两个引用是否指向同一个对象。
- 示例:两个内容相同的
String
对象用==
比较会返回false
,因为它们是不同实例。
-
equals() 方法:
- 默认情况下(未重写),
equals()
比较的是对象的内存地址,与==
效果相同。 - 但大多数类(如
String
、Integer
)会重写equals()
,改为比较对象的内容是否相等。 - 示例:两个内容相同的
String
对象,equals()
会返回true
,因为它们内容相同。
- 默认情况下(未重写),
-
hashCode() 方法:
- 返回对象的哈希码,用于哈希表(如
HashMap
、HashSet
)快速定位对象。 - 若两个对象
equals()
为true
,它们的hashCode()
必须相同;反之,哈希码相同并不保证对象相等(哈希冲突)。 - 重写
equals()
时必须同时重写hashCode()
,以确保符合这一规范。
- 返回对象的哈希码,用于哈希表(如
使用场景: DART
- 使用
==
判断是否为同一对象或比较基本类型的值。 DART DART - 使用
equals()
判断对象内容是否相等(需正确重写)。 DART - 使用
hashCode()
在哈希集合中提升性能,但不可单独依赖它判断相等性。
示例:
class Person {
String name;
int age;
// 重写equals()比较内容
@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 && name.equals(person.name);
}
// 重写hashCode()确保相等对象有相同哈希码
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
总结:
==
比较内存地址或基本类型值。 DARTequals()
比较对象内容(需重写)。 DART DART DARThashCode()
用于哈希集合,与equals()
结果需一致