作者:有你真好cc_693 | 来源:互联网 | 2024-12-14 12:33
1. 基本概念
在Java编程语言中,hashCode
方法是一个定义在 Object
类中的方法,因此所有的Java类都继承了这个方法。该方法的主要功能是返回一个整数形式的哈希码,这个哈希码通常基于对象的内容或状态计算得出,用于快速比较对象的唯一性。
哈希码并不直接对应于对象在内存中的具体地址,而是由JDK根据对象的内容或其他因素计算出的一个数值,用于标识对象。
2. hashCode的作用
2.1 提高查找效率
在数据结构如 HashMap
和 HashSet
中,hashCode
的主要用途是加速查找过程。当需要检查集合中是否存在某个对象时,通过计算该对象的 hashCode
可以迅速定位到可能存储该对象的位置,从而减少不必要的比较。
2.2 HashSet中的去重机制
以 HashSet
为例,它不允许存储重复的元素。当尝试向 HashSet
添加一个新元素时:
- 如果没有
hashCode
方法,系统需要遍历整个集合,调用 equals
方法逐个比较,这将导致效率极低。 - 有了
hashCode
方法后,系统可以通过哈希码快速定位到可能的存储位置。如果该位置已有元素,则进一步调用 equals
方法进行精确比较。这种方法显著提高了添加和查找元素的效率。
2.3 代码示例
下面是一个简单的 Person
类的实现,展示了如何重写 hashCode
和 equals
方法:
import java.util.HashSet;
public class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
System.out.println("hashCode被调用, hashCode=" + result);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
System.out.println("equals被调用了");
return true;
}
public static void main(String[] args) {
HashSet persOnHashSet= new HashSet<>();
personHashSet.add(new Person(1, "张三"));
personHashSet.add(new Person(2, "李四"));
personHashSet.add(new Person(1, "张三"));
System.out.println("personHashSet的长度是" + personHashSet.size());
}
}
运行上述代码,可以看到 hashCode
方法在每次添加新元素时都会被调用,而 equals
方法仅在 hashCode
相同的情况下被调用。最终,personHashSet
的大小为2,因为第三个元素与第一个元素相同,不会被重复添加。
3. hashCode与equals的关系
为了确保集合类(如 HashSet
和 HashMap
)的正确行为,hashCode
和 equals
方法之间必须保持一致:
- 如果两个对象通过
equals
方法判断为相等,那么它们的 hashCode
必须相同。 - 如果两个对象的
hashCode
相同,它们不一定是相等的,还需要通过 equals
方法进一步确认。 - 在重写
equals
方法时,应该同时重写 hashCode
方法,且两者使用的属性应保持一致。