哈希冲突

哈希冲突


   常见的哈希冲突解决方法: 


1.开放地址法 
2.链地址法(拉链法) 
3.再散列 (二次哈希法)
4.建立一个公共溢出区 
         以上方法都是解决哈希冲突的策略,但是在java.util.HashMap中,总体来说是使用的链地址法来解决冲突的。 
         当然了,使用链地址法会导致get的效率从o(1)降至o(n),所以在Java8中,使用的是平衡树来解决提高效率的。 

参考:http://blog.csdn.net/cpcpcp123/article/details/52744331 
                     HashMap底层是数组+链表+红黑树(JDK1.8)来实现的,根据key的hash值查找对应的位桶。 
1.当前索引数组为空,则将键值对以链表形式插入。 
2.当前索引数组已经存在,则判断当前链表是红黑树还时链表,然后插入。如果是链表插入到最后一个,判断长度是否大于8,大于8将链表转成红黑树。 
解决哈希冲突常用的两种方法是:开放定址法和链地址法 
  开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败。  
链地址法:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。

猜你喜欢

转载自blog.csdn.net/a214704/article/details/81293891