java 解决Hash冲突的办法
2019-12-28 本文已影响0人
MJLDG
1. 拉链法
jdk1.8 中HashMap,ConcurrentHashMap都是采用这个方法,使用链表来保存发生hash冲突的key,即不同的key有一样的hash值,将这些发生冲突的 value 组成一个单向链表(只有next指针,没有pre指针)
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
2. 开放地址法
就是即使key产生hash冲突,也不会形成链表,而是将所有元素都存入哈希表里。
发生hash冲突时,就以当前地址为基准,进行再寻址的方法去寻址下一个地址,
直到找到一个为空的地址为 止。
实现方式有:
1.线性探查:发生hash冲突时,顺序查找下一个位置,直到找到一个空位置(固定步长1探测)
2.二次探查:在发生hash冲突时,在表的左右位置进行按一定步长跳跃式探测(固定步长n探测)
3.伪随机探测:在发生hash冲突时,根据公式生成一个随机数,作为此次探测空位置的步长(随机步长n探测)。
3. 再哈希法
发生hash冲突时,使用第二个,第三个,第四个哈希函数来计算地址,直到无冲突时。
比较耗时。
4. 建立公共溢出区
为所有发生hash冲突的关键字记录一个公共的溢出区来存放。在查找的时候,
先与哈希表的相应位置比较,如果查找成功,则返回。
否则去公共溢出区按顺序一一查找。在冲突数据少时性能好,冲突数据多的时候耗时