为何重写equals时必须重写hashCode方法

当咱们写了一个类的时候,咱们通常要重写这个类的equals方法,由于全部类都继承Object,而Object中的equals方法是这么写的:bash

public boolean equals(Object obj){
    return this==obj;
}
复制代码

也就是Object中的equals方法实际上比较的是两个对象是不是同一个(包含内存地址的相等),显然当咱们只想比较两个对象的数值是否相等的时候这不是咱们所想要的。ui

首先咱们先看一下String的源码,重写了Object类的equals()和hashCode()方法this

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }

/*返回哈希码,String的哈希码计算方式为s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]*/
public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;

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

blog.csdn.net/qq_35580883…spa

相关文章
相关标签/搜索