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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NBoss 初级黑马   /  2016-9-6 23:55  /  538 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天老师讲了HashSet这个集合,听了一下解决哈希冲突方法,就是有一个单向链表,计算哈希值之后会把计算好的值放在链表中,然后有重复的哈希值会在已有的哈希值上再连接一个链表,如图
当时我就不理解链表里为空的是什么,为什么会有空的值,然后就各种查资料,最后查到源代码中HashSet底部维护了一个HashMap,而这个HashMap底部又维护了一个默认长度为16的数组,所以没有插入的地方就是null
还有就是对这个链表又有了深入的了解,HashMap里面没有出现hash冲突时,没有形成单链表时,hashmap查找元素很快,get()方法能够直接定位到元素,但是出现单链表后,单个bucket 里存储的不是一个 哈希值,而是一个哈希值 链,系统只能必须按顺序遍历每个哈希值,直到找到想搜索的哈希值 为止——如果恰好要搜索的 哈希值 位于该哈希值的最末端(该哈希值 是最早放入该哈希值 中),那系统必须循环到最后才能找到该元素。
       当创建 HashMap 时,有一个默认的负载因子(load factor),其默认值为 0.75,这是时间和空间成本上一种折衷:增大负载因子可以减少 Hash 表(就是那个默认长度为16的数组)所占用的内存空间,但会增加查询数据的时间开销,而查询是最频繁的的操作(HashMap 的 get() 与 put() 方法都要用到查询);减小负载因子会提高数据查询的性能,但会增加 Hash 表所占用的内存空间。

7 个回复

倒序浏览
可以的 写的很详细 加油
回复 使用道具 举报
可以的 研究的很透彻 虽然我理解的不多
回复 使用道具 举报
这个在数据结构中有介绍,HashMap的底层是散列表,类似于链表吧,但不全是,存储数据的时候,需要散列函数,根据散列函数的不同,来判断存放的具体位置,如果某一位置多个元素,这样就是造成了散列冲突,就会进行链表式的排列
回复 使用道具 举报
百度上对于哈希表和哈希函数有很多详解,我主要是对哈希冲突是的链式结构表有点小疑问,就查了各种资料,对于哈希函数通俗的来说就是一种算法,一种加密算法,典型的就是MD5加密,算法难免会有算出来的值一样,但原数不一样,这时就会产生哈希冲突,链式结构只是解决哈希冲突的一种方法,还有再哈希等等,就不在这里介绍了,百度有很多。
回复 使用道具 举报
自己的帖子自己顶
回复 使用道具 举报

写的很详细 ,谢谢分享
回复 使用道具 举报
NBoss 初级黑马 2016-9-19 23:06:09
8#
继续顶!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马