为什么重写equals方法必须重写hashcode方法

想要知道这个问题,首先需要知道hashcode它的作用:

HashCode的作用:

首先来看HashCode的作用,当把对象加入HashSet中时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会跟其他已经加入的对象的hashcode值作一个比较,如果没有相等的hashcode值,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,就会调用equals()方法来检查hashcode值相等的对象是否真的相同。如果两个对象相同,HashSet就不会让它加入。如果不同的话,就会把它重新散列到其他位置。这样我们就大大减少了 equals的次数,相应就大大提高了执行速度。

为什么重写equals就必须重写hashcode呢?

equals在object类里的作用是比较两个引用指向的是否是同一个对象, 也就是两个对象的地址是否相同,但是我们在实际开发过程中,这种开发方式往往不满足我们的需求,比如我们有一个person类,我们的需求可能是当一个人的年龄和姓名和性别都相同时,我们就认为这是同一个人所以我们需要重写equals方法来自行决定两个对象相等的判别方式 。但是在hashMap的底层判断两个对象是否相同,是需要hashcode和equals同时来决定的,先用hashcode进行比较找到大概的位置,如果相等了就使用equals进行精确判断,如果不相等就不用再次判断了,减少使用equals开销,所以如果我们只重写了equals但是没有重写hashcode,就可能会出现,equals比较相等,但是hashcode不等的情况,两个对象equals相等的话,hashcode值是必然相等的,这就产生了矛盾。

你可能感兴趣的:(Java基础,java,jvm,开发语言)