选择语言
durumis AI 总结的文章
- equals() 是用于比较对象內容是否相同的方法,hashCode() 是用于返回对象唯一整数值的方法,两者都 用于比较对象。
- 在哈希数据结构中,使用 hashCode() 来确定键,因此,需要同时重写 equals() 和 hashCode() 以确保相同的 哈希代码。
- 同时使用 equals() 和 hashCode() 可以有效地管理哈希数据结构中的相同对象。
equals()
equals() 用于比较对象的內容是否相同。通常称为等效比较,如果未重写 equals(),则在内部与 == 相同,因此它是相等比较。因此,如果您想正确地比较对象是否相等,则必须使用 equals()。
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode() 用于检查两个对象是否为同一对象。它具有与 == 相同的等效比较功能,但 hashCode() 方法返回一个整数,表示运行时对象的唯一值。通常,它返回堆中存储的对象的内存地址。
该方法带有 native 关键字,这是在 Java 中使用除 Java 之外的语言开发的语言时使用的关键字。
什么是哈希?
哈希是指使用哈希函数将可变大小的输入值转换为固定大小的输出值的過程。通过哈希获得的值称为哈希码。
equals() 和 hashCode()
由于相同的对象必须具有相同的内存地址,因此相同的对象必须具有相同的哈希码。因此,除了 equals() 之外,最好重写 hashCode() 来确保相同的哈希码。
哈希数据结构
public class Main {
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 2
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = 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);
}
像这样,尝试将两个相等的对象插入 HashSet 数据结构中。如果输出该 Set 的大小,则将显示 2。为什么呢?
这是因为使用哈希的数据结构在确定 Key 时使用 hashCode()。也就是说,在比较对象是否相等之前,它会比较两个对象的哈希码是否相等,然后确定两个对象是否相等。此时,如果 hashCode() 未重写,则将使用 Object 的 hashCode(),因此将返回每个对象存储的内存地址。因此,最好在使用哈希数据结构时除了 equals() 之外还重写 hashCode()。
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 1
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = 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);
}
来源
预期面试问题和答案
为什么 equals() 和 hashCode() 要一起使用?
这是因为使用哈希的数据结构在确定 Key 时使用 hashCode()。也就是说,在比较对象是否相等之前,它会比较两个对象的哈希码是否相等,然后确定两个对象是否相等。此时,如果 hashCode() 未重写,则将使用 Object 的 hashCode(),因此将返回每个对象存储的内存地址。因此,最好在使用哈希数据结构时除了 equals() 之外还重写 hashCode()。