美文网首页
浅谈HashCode()和equals()

浅谈HashCode()和equals()

作者: 是一动不动的friend | 来源:发表于2017-10-21 21:18 被阅读9次

很多人不太懂HashCode()方法是什么equals()方法比的是什么,更不知道什么时候重写这两个方法以及怎么重写。为了讲清楚这个问题我们先来看看Object类和String类中的HashCode()和equals()是什么样的。

1.Object中的HashCode()方法返回的是对象的地址,equals()而比较的也是对象的地址。

public boolean equals(Object obj) {
        return (this == obj);
    }

2.String中重写了HashCode()方法,重写的方法是s[0]31^(n-1) + s[1]31^(n-2) + … + s[n-1]。之所以会用31是因为31是质数,使用质数计算哈希码,由于质数的特性,它与其他数字相乘之后,计算结果唯一的概率更大,哈希冲突的概率更小。
使用的质数越大,哈希冲突的概率越小,但是计算的速度也越慢;31是哈希冲突和性能的折中,实际上是实验观测的结果。

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

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

String类中的equals()方法实际上比的也是String的内容是否相同

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;
    }

什么时候需要重写HashCode()和equals()方法呢?

当此容器是由Hash原理构建的如HashSet、LinkedHashSet、HashMap时对放入其中的对象重写HashCode()和equals()方法是必须的。原因就在于确保相同的键值对象(key)有相同的散列码,而且HashCode不能依赖对象中易变的内容,否则当此内容发生变化时,HashCode也会变。
其它带有Set属性的容器如TreeSet等,重写equals()方法是必须的但重写HashCode()方法却不是必须的,但是对于良好的编程风格来说,在覆盖equals()方法时同时也覆盖HashCode()方法。

如何重写HashCode()和equals()方法?

1)给int变量赋予某个非零值常量。
2)为对象内每个有意义的域f(即每个可以做出equals操作的域,如String中的每个字符)计算出一个int散列码。
3)合并计算得到的散列码:
result=37*result+c;
4)返回result
5)检查hashcode()最后生成的结果,确保相同的对象有相同的散列码。

相关文章

网友评论

      本文标题:浅谈HashCode()和equals()

      本文链接:https://www.haomeiwen.com/subject/ckniuxtx.html