为什么在重写equals方法时都要重写hashCode方法呢?
首先jdk的要求是这样的,equals与hashcode间的关系:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
在java的集合List、Map、Set中,HashMap、HashSet的存储是采用哈希表结构存储的
equals是内容比较 ,hashcode是int类型,equals的比较效率肯定是比较低的,由equals重写的复杂度决定比较的效率。
由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那就不必再进行equals的比较了,这样就大大减少了equals比较的次数了,这对比需要比较的数量很大的效率提高是很明显的,
一个很好的例子就是在集合中的使用;
我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,单靠equals方法一样比较的话,如果原来集合中有1万个元素了,那么放入1个元素,如果要将前面的所有元素都进行比较,看看是否有重复,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,
利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,
有,那么就用equals比较,
没有,如果没有则直接插入,这样就大大减少了equals的使用次数,执行效率就大大提高了。
还有一个后果就是:
如果只重写了equals()的方法,而不重写hashcode的方法,Object中hashcode是根据对象的存储地址转换而形成的同一个哈希值。
这时候就有可能因为没有重写hashcode方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题,
实际例子中就是相等的对象可以同时出现在Set中