Object的equals()和hashcode()方法
在Object类中,equals方法底层是通过 “==” 来比较两个对象是否相同,也就是比较两个对象的地址值,因为java规定,若equals()方法已经判定两个对象相同,那么这两个对象的hashcode()方法得到的hash值也应该是相同的。所以java的Object类中对hashcode的实现,其hash值的计算是由对象的地址决定的。
重写equals()不重写hashcode()的问题
假设你写了一个类,重写了equals()方法,将原来的底层逻辑 “==” 改为了按照对象值的内容进行比较。
此时就会出现这种情况:
对象A和对象B其值的内容是相同的,所以用equals()方法进行比较的时候,A和B是相同的,但是由于hashcode()方法没有重写,所以还是用的是Object类的实现。那么由于A和B的对象的地址值不同,那么他俩的hash值也必然不同。因此,会出现equals()判断相同,而hash值不同的情况。违背了Java的要求。那么当你使用HashSet,HashMap等类时,因为其底层插入数据与hash值的比较相关,所以就会出现问题。
因此,当你重写equals方法时,请按照Java的要求,也重写hashcode方法,这两个方法是配套使用的。