重写equals就必须重写hashCode的原理分析
Posted fanguangdexiaoyuer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写equals就必须重写hashCode的原理分析相关的知识,希望对你有一定的参考价值。
不被重写(原生Object)的hashCode和equals是什么样的?
不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。
不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。
为什么需要重写equals和hashCode方法?
所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求。
1.在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回 同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。
2.如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。
3.如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。
即:
两个对象相等,hashcode一定相等
两个对象不等,hashcode不一定不等
hashcode相等,两个对象不一定相等
hashcode不等,两个对象一定不等
如果只重写了equals而没有重写hashCode
以上是关于重写equals就必须重写hashCode的原理分析的主要内容,如果未能解决你的问题,请参考以下文章
谈谈HashSet的存储原理及为什么重写equals必须重写hashcode方法
为什么重写equals()方法就必须重写hashCode()方法
为什么重写equals()就必须重写hashCode(),什么情况下可以不重写hashCode()