HashSet实现了Set接口。而且也应该知道Set集合是不能包含重复元素的。那么怎么判断要add的对象是否是重复的元素呢?这就是用hashCode()方法判断的。hashCode()是Object类的方法(equals()方法也是),所有类都间接或直接继承了Object类,因此都继承了hashCode()方法。Object类的hashCode()方法的返回值以整数形式表示一个对象的地址(未必是真正的地址,通过某种转换表示这个地址而已),即当调用HashSet的add(Object a)时,将a的hashCode值(直接说成hashCode值)与已有元素的hashCode值进行比较,如果不同则直接加进去,如果hashCode值相同则接着调用equals方法比较,如果equals方法返回真则不加,返回true则加进去。
如果不重写这两个方法,子类都将直接继承Object的两个方法,即会直接比较两个对象的地址。这在实际项目开发中意义较少的,一般情况下都会希望以内容来判断时候能加进去(即add)。
比如当
People a = new People("zhangsan");
People b = new People("zhangsan");
set.add(a);
set.add(b);
这个时候,如果不重写hashCode方法的话,a和b两个对象都可以加进去的,因为直接继承Object类的,hashCode方法,即比较两个地址。而两个对象的地址肯定是不一样的。
而我们希望的是以name(People的一个成员变量)来判断是否能加进去(比如实际项目中希望存名字不一样的人),这个时候就需要重写hashCode方法来实现这个功能了。就是让上面的set.add(b)不能加进去,因为名字同样是张三的对象,加进去没用。。。大概这些意思吧(说的比较啰嗦,希望你能体会)
对了一般重写hashCode方法的时候也会重写equals方法,反之也成立。
|