首先看一下 我们先来看一下Object.hashCode的通用约定(摘自《Effective Java》第45页)
1、在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回 同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。
2、如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。
3、如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。
如果只重写了equals方法而没有重写hashCode方法的话,则会违反约定的第二条:相等的对象必须具有相等的散列码(hashCode)(这里的意思就是,重写的equals()方法比较得两个对象的内容如果相同的话,他们的hashCode也要相等)
为什么呢?
如果不被重写(原生)的hashCode和equals是什么样的?
- 不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。
- 不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。
所以说,不重写的话,即使用重写的equals()方法判断了两个对象的内容相等,hashCode也不会相等,不能满足第二条约定!!!所以重写了equals()方法,hashCode方法也必须要重写!!!
我们只需要知道这个原理即可,这些已经帮我们自动重写好了