java的基类Object提供了两种判断对象是否相等的方法equals()和hashcode(),equals判断两对象内存地址是否相等,hashcode()判断两对象的哈希吗。
equals()方法:
Object类中equals方法实现如下:
可以看到,只要他们是同一个对象,就会返回true.
hashcode()方法:
Object类中的hashcode():
可看到Object中的hashcode是一个native方法,实际上是将对象地址的哈希值返回。
hashcode()的作用:
总的来说,hashcode()在哈希表中起作用,如HashSet,HashMap;
重写的equals()一般比较全面和复杂,所以执行效率就会很低,而利用hashcode()进行对比,只需要生成一个哈希值进行比较就可以,效率很高。但是hashcode()存在弊端,有时候不同的对象生成的hash值相同。
所以对于大量并且快速对比的话,如果都用equals对比,效率实在是太低了,所以解决方案是:每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
String类中的equals()方法和hashcode()方法:
源码如下:
可以看出:
String对象equals()相等的条件是二者同为String对象,长度相同,且字符串值完全相同;不要求二者是同一个对象。
Strin类将hashcode()缓存为哈希值。
为什么重写了equals()就要重写hashcode()?
首先equals与hashcode间的关系是这样的:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的.