黑马程序员技术交流社区

标题: Hashset问题 [打印本页]

作者: qmayuan    时间: 2013-8-8 10:54
标题: Hashset问题
Hashset会为每个存入的对象计算出hashcode  然后存入相应的区域,
Test t1 = new Test(1,1);
Test t2 = new Test(2,2);
Test t3 = new Test(1,1);
Collections c = new Hashset();
c.add(t1);
c.add(t2);
c.add(t3);
System.out.println(c.size());
为什么把Test 对象中加上Hashcode()方法  就会输出2 而不加就输出3呢   不过不加 就不计算对象的hashcode了么?
老师说放对象之前会计算hashcode  然后计算出区域位置, 然后放入进去,下次再放入对象的时候会计算对象的hashcode 在算出区域位置  在到相应的区域进行比较  如果没有就存进去,那相同的对象计算出来的hashcode值不应该也是想同的么?



作者: sergio    时间: 2013-8-8 13:10
哈希表的结构要清楚,是数组跟单向链表的组合。单向链表靠的就是hashcode值挂靠在数组的位置上的。
作者: ☆今☆    时间: 2013-8-8 22:04
如果你不重写hashCode()的话,那么就会调用Object中的hashCode()方法,
而此方法是,如果不是通过对象,那么hashCode的值不一样,创建的3个Test对象就都不一样,所以会都添加进Set,所以长度是3.
而重写hashCode()方法后,就会按重定义的进行比较,两个Test对象中两个成员变量的值相同,就视为同一个相同,那么hashCode值相同.就不进行再存储了.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2