equals()方法和hashCode()方法都是Java中Object父类定义的方法
equals()在Object类中是比较两对象的地址是否相同,比如String字符串重写equals方法变成比较两字符串的值是否相等
String类重写的equals():
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
例如我们在使用HashSet集合时的保存步骤:
- 首先会通过hashCode()获取对象的哈希值,找到对应的哈希桶
- 若此时桶里没有数据则代表当前集合中无重复数据
- 若此时桶里有数据,则通过equals()方法判断两对象是否相等
- 若相等则代表hashSet中已有相同的数据,则该数据无法存入
- 若不相等则形成哈希链表(哈希碰撞)
在这个过程中,若每个数据都进行equals()比较的话,对于大量数据下将会带来巨大的比较成本,大大增加代码的时间复杂度,而引入hashCode则减少了equals()比较次数
所以
如果重写hashCode()不重写equals()?
则对象在哈希值相同的情况下equals()比较地址不同则导致误判
而如果重写equals()而不重写hashCode()?
则直接在比较哈希值时就会产生错误
所以,在重写equals()必须要重写hashCode()