这是我参与新手入门的第2篇文章
往期回顾
上一章我们讲了数组与链表是什么,带大家初识了一下这两个数据结构,这一次还是不带大家认识HashMap,这次要带大家了解一下Hash 与 Hash碰撞
Hash是什么?Hash碰撞是什么?
hash就是计算这个元素的hashcode,然后存放在相同的的hashcode桶中
hash 碰撞形成链表,hash碰撞就是hash一个对象后的 hashcode 值已经存在数组里面了,就是两个hashcode值一样,那么他会形成链表,链接在相同的后面
当我们想要往一个HashMap中put一个元素的时候,需要通过一定的算法计算出应该把他放到哪个桶中,这个过程就叫做哈希(hash),对应的就是HashMap中的hash方法。
如何解决Hash冲突
在数据结构中有这两种方法可以解决Hash冲突
开放定址法
: 开放定址法也叫闭散列,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。
拉链法
: 拉链法又叫开散列,首先将关键码根据哈希函数来计算出哈希地址,对相同的哈希地址放在某一子集合中,每个子集合叫做一个桶,每个通放的都是哈希冲突元素,每个桶中的元素通过单链表连接,每个链表的头节点存放在哈希表中,这种结构叫做哈希桶。
HashMap 采用了 拉链法 也就是哈希桶
为什么要减少hash冲突?
有上面得出结论可知:
哈希函数得到的hash让元素在数组中分布更均匀,减少哈希碰撞
数组分布均匀了,因为数组寻址很快,所以查找速度也快
散列表是什么?数组里面保存的数据是一个链表,这就是散列表结构
总结
- 下一章我们将会讲解 HashMap的代码部分
- HashMap 的Hash碰撞是尤为重要
- 请大家回顾上期数组与链表的知识
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END