你应该知道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方法,反之也成立。
不懂的继续讨论
hashset容器里面应该页重写了equels和hascode方法。。在有些容器中没有重写这两个方法,而你又想将对象存到这个容器中的时候,就得重写这两方法。。为的是保证在取出对象的时候取出的对象是你存进去的对象。。
当比较的是栈区的数据时,重写equals
可以参考一下
http://startor.javaeye.com/blog/381627