0%

JavaSE String equal() hashCode()

1
2
3
4
5
6
7
String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
1
2
3
4
false
true
99162322
99162322

equals()反映的是对象或变量具体的值,即两个对象里面包含的值–可能是对象的引用,也可能是值类型的值。

hashCode()是根据内容计算出来

两个obj,如果equals()相等,hashCode()一定相等。

两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。

例子:

使用num%8的结果作为hashcode,那么当9%8=1,17%8=1,它们有相同的hash值,但是内容不一定相同。

结论
因此判断两个对象是否是一个对象,先看hashcode,如果不同一定不相同;如果相同还要去看equal()的结果。也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。

那么,重写了equals(),为什么还要重写hashCode()呢?
想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊