![](https://i-blog.csdnimg.cn/blog_migrate/5480d1db0d834175f924d9509ba4764a.png)
Java中Object的hashCode()和equals()
从图中可知,hashCode()是一个Java本地方法native,返回值为实例对象引用中存储的对象的内存地址,而equals()的比较就是比较实例对象的内存地址是否相同。
在hashCode()方法的注释说明中,总结有如下陈述:
a. Java程序运行时,同一实例对象多次调用hashCode()方法时,必须一致返回相同的整数数字,而前提是对象进行equals()比较时所用信息没有被修改;
b. 如果调用equals()方法,两个对象相同,则两个对象的任意一个对象调用hashCode()都必须返回相同整数结果;
c. 如果调用equals()方法两个实例对象不相等,则两个对象的任意一个调用hashCode()方法不强制要求一定生成不同的整数结果;但是程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
综合上述,hashCode()和equals()保持一致,如果equals方法返回true,那么两个对象的hasCode()返回值必须一样;如果equals方法返回false,hashcode可以不一样,但不利于哈希表的性能。因此,重写equals()方法就必须重写hashCode()方法,就是为了保证hash表的性能。
而且,在不重写equals()和hashCode()时,存在不同实例对象的hashCode()返回值相同,而equals()不同,也就是Hash冲突。根本原因是因为hashCode()返回值为int,最大值为Integer.Max_Value,如果对象足够多会出现Hash冲突。
在重写hashCode()和equals()方法时,对于Hash表而言,判断hashcode与equals都相等时,才会判断两个实例对象是重复的。如果仅仅重写其中一个方法,仍会导致出现重复性的数据插入等现象,数据冗余。因此必须同时重写上述两个方法。
总结:
1、涉及到Hash表等相关数据结构(如HashSet、HashMap等)操作的,一定要保持equals()与hashCode()的同步。如果仅仅是比较内容是否相等而重写了equals()的,则不用重写hashCode();
2、如果equals()相等,则hashCode()一定相等;
3、如果两个对象的hashCode() 相等,则equals()不一定相等;