黑马程序员技术交流社区

标题: 关于集合的深入理解 [打印本页]

作者: 何小红    时间: 2012-10-2 18:31
标题: 关于集合的深入理解
看到很多关于集合的提问,在看张老师的视频中,不禁把这些疑问提出来
链表明白一点,只是hashSet中,hashCode在里面究竟是什么功能?所谓存储的区域,究竟是如何划分的?为什么有些相同的元素也可以存进hashSet?
说白了,就是很多底层的东西没有明白
哪位高手解解惑?
谢谢!
作者: 武庆东    时间: 2012-10-2 19:48
看到很多关于集合的提问,在看张老师的视频中,不禁把这些疑问提出来
链表明白一点,只是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,从而提高对象比较的速度。

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

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




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