您的位置:首页 > 其它

重写equals方法时必须重写hashCode方法的理由

2017-08-18 14:56 288 查看
equals方法和hashCode方法都是Object类的方法,在Object类中的equals方法是直接用“==”来比较的,而“==”比较得是引用的地址是否相等,如一个类A的两个实例b、c,在使用b.equals(c)时他比较得是b、c这两个引用的地址(他们是不是指向同一个对象)而不是引用所指向的对象内容,而hashCode方法则是返回该对象的哈希码值,也就是对象在内存中的实际地址值(对象所占内存的首地址)。

当我们在实际应用中需要根据业务逻辑来对两个对象做相等判断时就不能直接使用Object中定义的equals方法了,所以要重写equals方法,而对于hashCode方法,在javaAPI中有说明,当两个对象使用equals比较相等时总是会返回相同的一个整数值,那么这里既然equals的比较策略以及变了,那hashCode方法当然也不能按照原来的策略来生成hashCode值了,所以也要一通重写了,而如果、这时候不重写hashCode的话,即便你用equals方法比较的到两个对象是相等的结论那你也得不到相同的哈希码。

集合中的应用:

由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用:

我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。

继续上面的话题,为什么必须要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  equals hashcode