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