A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qmayuan 中级黑马   /  2013-8-8 10:54  /  1128 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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值不应该也是想同的么?


评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
哈希表的结构要清楚,是数组跟单向链表的组合。单向链表靠的就是hashcode值挂靠在数组的位置上的。
回复 使用道具 举报
如果你不重写hashCode()的话,那么就会调用Object中的hashCode()方法,
而此方法是,如果不是通过对象,那么hashCode的值不一样,创建的3个Test对象就都不一样,所以会都添加进Set,所以长度是3.
而重写hashCode()方法后,就会按重定义的进行比较,两个Test对象中两个成员变量的值相同,就视为同一个相同,那么hashCode值相同.就不进行再存储了.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马