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

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方法如下:

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 wechat
欢迎关注itzhai公众号