多年前,在我开始学习java语法的时候,我就听到了一条规则。
重写equals方法就必须要重写hashcode方法,但是重写equals方法有一些规则,重写hashcode方法却貌似没有什么规则似的,搞的我一直都云里雾里的,总以为是equals方法的底层调用了hashcode方法之类的。
时隔多年,我终于理解了为什么会有“重写equals方法就必须要重写hashcode方法”这一规则。是说hashcode这个方法是在hashmap、hashTable、hashset中才会用到的,如果我们现在重写了一个类的equals方法,把一个对象的equals定义为其字段值相等,但是两个值相等的对象返回的hashcode并不相同,那么当你以这个对象为key向hashmap中装填数据时,可能就会发现,有两个逻辑上相等的key并列在这个散列表中,这就是有悖于散列表这种数据结构了。
所以说,如果重新设计了equals方法,还是应该尽量相应的重写hashcode方法,保证equals返回true时,相应的hashcode也是相等的。
毕竟我们的代码是要千秋万代的传承下去的,也许现在没有被某个散列表的数据结构使用所以不会有问题,但是以后一旦有问题就是个无法发现的问题。