- 在正确的逻辑下,两个对象的hashcode一样,不代表两个对象equals;两个对象equals,则hashcode一定一样
- 在HashSet集合中,是不允许有重复的元素的,那么,set怎么才知道元素是不重复的?HashSet中会维护一张hash表,在对象存入时,会根据对象的hashcode定位到hash表中的位置,如果位置上是空的,那么该对将象直接存入hash表,如果在位置上不是空的,则进行equals比较(因为hashcode一样并不代表对象equals),equals返回true,则不存入,否则,放入hash表同个位置的链中。
- hashcode方法默认是获取对象地址值。
- 为什么jdk极力推荐重写了equals方法后再重写hashcode方法?
如果你不这么做的话程序可能和你预想要的结果会有点不一样。试想有个Student对象,有id和name两个字段,你重写其equals方法,让它根据id和name来判断两个对象是否equals,你现在要将两个相同id和name的student存入HashSet,HashSet如上所述是不允许相同元素存在的,HashSet判断到两个对象的hashcode是不相等的,直接存入了hash表中。你本来想看到的是两个对象一样,只存入一个,但是目前的结果,显然不是你想看到的。
public class Student{ private String id; private String name; //--getter setter---
}
所以这就是java推荐你重写equals方法后还要重写hashcode方法,这样在使用诸如HashSet和HashMap等集合时才能达到预期结果。