首先明确一点,咱们如今用的equals方法都是string重写过的,而并不是原生的object类下的。code
那若是重写了equals方法,而没有重写hashcode方法会出现什么状况呢?对象
若是重写了equals方法,那么能够确保两个比较对象的属性是相同的,那么此时若是未重写hashcode方法,因为hashcode比较是内存地址是否相同,那么此时不重写hashcode方法的话,会使用原生的object类下的hashcode方法,那两个比较对象的内存地址确定是不一样的,这显然是不符合规则。内存
因此重写equals方法的时候,必须保证重写hashcode方法string
1. 若是两个对象相同(即用equals比较返回true),那么它们的hashCode值必定要相同!!!!;hash
2. 若是两个对象不一样(即用equals比较返回true),那么它们的hashCode值可能相同也可能不一样;(重写equals方法,未重写hashcode状况下)object
3. 若是两个对象的hashCode相同(存在哈希冲突),那么它们可能相同也可能不一样(即equals比较多是false也多是true)方法
4. 若是两个对象的hashCode不一样,那么他们确定不一样(即用equals比较返回false)co
想一下如果重写了equals方法,但未重写hashcode方法的话,在实际应用中带来的严重后果
以hashset举例,咱们都知道hashset存储的是无序不重复的对象,那他是如何实现的?
首先经过equals方法判断两个对象是否相等,而后根据调用两个对象的hashcode方法获得他们的hashcode值。若是此时只重写了equals方法,而未对hashcode方法重写,那么结果就是比较后发现二者的内存地址不一样,认为这是两个不一样的对象,而后存储的时候就会都存储进来,而且存储在不一样的位置。这就不符合了hashset的原则了。出现了两个相同的对象