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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 风决 中级黑马   /  2014-7-15 17:37  /  1669 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

hashSet比较的依据是 hashcode()和equals(),
而TreeSet却是用compare比较器,为什么不用hashCode()和equals(),谁能解释下原因?

5 个回复

倒序浏览
因为他们使用的数据结构不同,hashset底层使用的是哈希算法存储数据数据结构,而TreeSet用的是底层用的是树形结构存储的数据结构。
回复 使用道具 举报
我是新人  我的理解:
Hashset存储数据结构时  哈希表结构
hashcode()是一种算法  通过这个算法算出要存入元素的 哈希值  ,同个这个哈希值在表中 找到位置(这个位置好像是定了 )    看着个位置上有没有元素,如果没有 就存到这。  如果这个哈希值位置有元素了  那么在通过equale()比较类容相同不,类容相同,就不存。不同就把他存到他附近。    所以他储存的元素师无序。
  
而 Treeset   他是 二叉树 结构 存储的  ,       新元素和旧元素比较。旧元素分左叉  和右叉  ,如果新元素大于旧元素  存右叉  ,如果小于存左叉。等于就不存。有一定的顺序。


回复 使用道具 举报
简单来说,就是2楼所说的数据结构不同,一个是哈希表,一个是二叉树。如果打破砂锅问到底,那就要了解哈希表和哈希值到底是什么东东。

访问数组元素之所以快,是因为可以用下标访问。只要知道数组的起始地址,比如说一个int数组的起始地址是a,那么第k个元素的地址就是a+k*4,一步就能找到任意位置的元素。哈希值也是类似数组下标的思路:给每个对象编个号(还记得hashCode()方法返回值是int么),只要告知编号,对应的对象就找到了。这种哈希值和对象的对应关系就组成了哈希表。

理想情况下,我们希望每个对象都分配一个唯一的编号,这样查找起来最快。但是任何事情都是有代价的。按这种方法,如果有1万个不同对象,哈希表的长度就是1万行,存储空间开销巨大。这时候我们就需要做一点权衡,允许多个不同对象有相同的哈希值(hashCode()对不同对象可以返回相同的值)。

比如,1万个对象,我开辟100个哈希值,你可以想象成100只桶,那么平均每只桶(哈希值)内放100个对象(让对象尽可能均匀分布于桶中是评价hashCode()方法优劣的主要指标)。这样当我要查找某个对象时,就分为两个步骤:1.找桶2.桶内找对象。找桶的步骤对应的就是hashCode()方法。1万个对象,通过找桶,我就排除了9900个对象,只要在hashCode()返回值所在的桶中找就可以了。在桶中找,就需要第二个方法来确定我要找的到底是哪个对象,于是equals()方法闪亮登场了。这就是HashSet需要两个方法的原因

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报 1 0
底层数据结构不一样
回复 使用道具 举报
个人觉得HashSet只要判断是否重复所以用hashCode和equals方法就好,
而TreeSet需要比较大小,所以要用compareTo方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马