要了解哈希冲突,先了解哈希算法
所谓哈希算法就是一定的输入通过哈希运算输出哈希值的计算方法
当两个不同的输入,输出值相同,我们就称之为哈希冲突
一般来说,解决哈希冲突有四种方案
(1) 拉链法
非常地通俗易懂,当产生哈希冲突时,将元素链接到链表上,查询时遍历链表
我们在 Java 集合中熟知的 HashMap 就是采用此种方式
所以它的优缺点点和 HashMap 类似
优点:删除简单,去掉链表上元素即可
缺点:链表过长时候影响遍历效率,从而影响查询效率,在 Java 1.8中对此有针对性优化,当链表长度超过阈值 8 时,链表会转换成红黑树,从而提高查询效率
(2) 再哈希法
俗话说,一次不行,那就再来一次
再哈希法的含义就是,当一次哈希运算产生哈希冲突时,再进行一次哈希运算重新计算哈希值,
直到没有冲突为止
优点:简单粗暴,哈希值不易产生聚集
缺点:计算次数过多,会影响读写的效率
(3) 再散列法
它的思想核心就是此处不留爷,自有留爷处
当产生冲突时,就寻找另一个地址,直到不冲突为止,将元素放入其中,若整个空间都没有空余的地址,则产生溢出
优点:只要哈希表还有位置,就能找到合适的地方
缺点:寻址的次数不可控,次数过多会影响读写性能,同时删除也比较麻烦
(4) 公共溢出区
就是在哈希表之外创建一个公共溢出区,专门用来存放产生哈希冲突的元素
查找时,先从哈希表查,查不到就从公共溢出区去查
优点:独立的空间,不需要其他的操作
缺点:当冲突过多时,公共溢出区过大,影响查询效率