微信搜索🔍「码农田小齐」,关注这个在纽约的程序媛,回复「01-05」能够获取计算机精选书籍、我的刷题笔记、大厂面经、面试资料等资源,么么哒~
通常来讲哈希冲突有两大类解决方式git
- Separate chaining
- Open addressing
Java 中采用的是第一种 Separate chaining
,即在发生碰撞的那个桶后面再加一条“链”来存储,那么这个“链”使用的具体是什么数据结构,不一样的版本稍有不一样:github
在 JDK1.6 和 1.7 中,是用 链表存储的,这样若是碰撞不少的话,就变成了在链表上的查找,worst case 就是 O(n);在 JDK 1.8 进行了优化,当链表长度较大时(超过 8),会采用红黑树来存储,这样大大提升了查找效率。面试
(话说,这个还真的喜欢考,已经在屡次面试中被问过了,还有面试官问为何是超过“8”才用红黑树🤔)微信
第二种方法 open addressing
也是很是重要的思想,由于在真实的分布式系统里,有不少地方会用到 hash 的思想但又不适合用 seprate chaining
。数据结构
这种方法是顺序查找,若是这个桶里已经被占了,那就按照“某种方式”继续找下一个没有被占的桶,直到找到第一个空的。分布式
如图所示,John Smith 和 Sandra Dee 发生了哈希冲突,都被计算到 152 号桶,因而 Sandra 就去了下一个空位 - 153 号桶,固然也会对以后的 key 发生影响:Ted Baker 计算结果本应是放在 153 号的,但鉴于已经被 Sandra 占了,就只能再去下一个空位了,因此到了 154 号。学习
这种方式叫作 Linear probing
线性探查,就像上图所示,一个个的顺着找下一个空位。固然还有其余的方式,好比去找平方数,或者 Double hashing.优化
若是你喜欢这篇文章,记得给我点赞留言哦~大家的支持和承认,就是我创做的最大动力,咱们下篇文章见!spa
我是小齐,纽约程序媛,终生学习者,天天晚上 9 点,云自习室里不见不散!code
更多干货文章见个人 Github: https://github.com/xiaoqi6666...