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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何小红 中级黑马   /  2012-10-2 18:31  /  2257 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看到很多关于集合的提问,在看张老师的视频中,不禁把这些疑问提出来
链表明白一点,只是hashSet中,hashCode在里面究竟是什么功能?所谓存储的区域,究竟是如何划分的?为什么有些相同的元素也可以存进hashSet?
说白了,就是很多底层的东西没有明白
哪位高手解解惑?
谢谢!

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
看到很多关于集合的提问,在看张老师的视频中,不禁把这些疑问提出来
链表明白一点,只是hashSet中,hashCode在里面究竟是什么功能?
解答:表面看起来,HashSet集合里的元素都没有索引,实际上当程序向HashSet集合中添加元素时,HashSet会根据元素的hashCode值来决定他的存储位置,即每个元素的hashCode就是他的“索引”,从而可以自由增加HashSet的长度,并可以根据元素的hashCode值来访问元素。因此,当从HashSet中访问元素时,HashSet先计算该元素的hashCode值,然后直接到该hashCode对应的位置去取出元素--这就是HashSet速度很快的原因。
所谓存储的区域,究竟是如何划分的?为什么有些相同的元素也可以存进hashSet?
解答:如何划分,这个不在了解范围。相同元素可以存入hashSet,那是因为他们的hashcode值不一样,这就涉及到HashSet集合保证元素唯一性:
               通过元素的hashCode方法,和equals方法完成的。                 当元素的hashCode值相同时,才继续判断元素的equals是否为true。 
             如果为true,那么视为相同元素,不存。如果为false,那么存储。                 如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。

说白了,就是很多底层的东西没有明白
哪位高手解解惑?
谢谢!

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一个问题:hashSet中,hashCode在里面究竟是什么功能?
    要理解hashCode方法的功能,先要理解hash(也被翻译为哈希、散列)算法的功能:它能保证通过一个对象快速查找到另一个对象。hash算法的价值在于速度,它可以保证查询得到快速执行。当需要查询集合中某个元素时,hash算法可以直接根据该元素的值得到该元素保存在何处,从而可以让程序快速找到该元素。为了理解这个概念,可以先看数组(数组是所有能存储一组元素里最快的数据结构):数组可以包含多个元素,每个元素也有索引,如果需要访问某个数组元素,只需提供该元素的索引,该索引即指出了该元素在数组内存区里的存储位置。
第二个问题:所谓存储的区域,究竟是如何划分的?
    表面上看起来HashSet集合里的元素都没有索引,实际上当程序向HashSet集合中添加元素时,HashSet会根据该元素的hashCode值来决定它的存储位置——也就是说每个元素的hashCode就是它的“索引”。
第三个问题:为什么有些相同的元素也可以存进hashSet?
      因为如果存的是对象,new出来的,那么它们的地址是不同的,哈希值也不同,看似一样,其实它们是不一样的。一般情况,相同的元素是不能同时存储的,除非重写它的hashCode()方法。。
明白了么?希望对你有所帮助,谢谢!^^

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢两位,的确对我很有帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马