equals和hashcode都是Object的方法,如果没有重写这两个方法,那么
equals就和”==”一样,比较的时候比较的是对象的引用,也就是对象的物理存储地址。那么就有可能出现两个一模一样的new 出来的对象比较为不一样的情况。因为他们是new出来的,所以在堆里都有自己的内存空间,也就有不同的物理存储地址,所以比较结果不同。

hashcode未重新时默认是使用对象的存储地址算出来的。hashcode是一个内存区域的标识,一个内存区域可能多个对象。

在set,map里要求不能重复,比较的时候会先算出对象的hashcode,也就是对象所在的内存区域标识,然后与这个区域内的对象进行比较。也就是说在set,map这种结构下,比较的顺序是先比较hashcode看在不在一个区域内,然后进行equals比较。
如果自己定义重写了一个equals方法,但是没有重写hashcode方法,那么有可能出现即使两个对象按照重写的equals方法比较结果是一样的,但是他俩的内存区域标识不一样,就会在第一步比较hashcode的时候被判定为不一样,重写的equals也就失效了。
所以为了按照预期的构想,让equals生效,那么hashcode也要重写。hascode比完再比equals,那么如果equals相等,那么hascode一定相等,不然equals都没机会比。另一方面,hascode比较想同,只能说明两个对象在同一个内存区域,并不能保证equals相同。
可以根据equals相同hashcode相同,因为hashcode是前提。反过来就不能保证。


版权声明:本文为qq_41422804原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41422804/article/details/128752079