Java基础笔记 - hashCode()与equals()方法的介绍和使用场合

发布于 2011-10-11 | 更新于 2020-09-20

equals方法一般是判断两个对象是否相等,可以重写。

Object中的equals方法比较的规则是这样的:

指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

  • 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。

  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

  • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

  • 对于任何非空引用值 x,x.equals(null) 都应返回 false。

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

判断对象是否相等的hashCode()方法

在HashSet中添加元素时,会判断添加的元素跟已经在HashSet中村中的hashCode是否相等,如果相等则不添加。

而默认的情况下,hashCode是使用对象地址生成的,如果要做特别的添加规则,可以重写这个方法。

如String类就重写了该方法,使得字符串相等时,hashCode也相等,String类的hashCode方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}

这个方法返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:

s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]

使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

本文作者: arthinking

本文链接: https://www.itzhai.comjava-based-notebook-hashcode-and-equals-method-of-the-introduction-and-use-of-applications.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。