大伙一定听说过:“要同时重写hashCode和equals方法”,为什么要这样呢?
先来看看如下的代码:
1 | public class Main { |
输出如下:
1 | false |
两个不同对象的哈希码为什么会相等呢?让我们先看下java.lang.String的hashCode方法
1 | // 空字符串的哈希码为0 |
换言之,字符串的哈希码为
$$
\mathrm{hash\ code} = s[0] \times 31^{n-1} + s[1] \times 31^{n-2} + … + s[n-1]
$$
由于字符‘0’的ASCII码值为48,‘1’的ASCII码值为49。因此,字符串“10”的哈希码为$49 \times 31 + 48 = 1567$。
而java.lang.Integer中hashCode方法如下
1 |
|
当两个对象的hashCode相等时,它们不一定相等。但是,当两个对象相等时,它们的hashCode必须相等。
java.util.Arrays
1 | public static int hashCode(Object a[]) { |
java.lang.Object
1 | public native int hashCode(); |