美文网首页
java 解决Hash冲突的办法

java 解决Hash冲突的办法

作者: MJLDG | 来源:发表于2019-12-28 11:31 被阅读0次

    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冲突的关键字记录一个公共的溢出区来存放。在查找的时候,
    先与哈希表的相应位置比较,如果查找成功,则返回。
    否则去公共溢出区按顺序一一查找。在冲突数据少时性能好,冲突数据多的时候耗时

    相关文章

      网友评论

          本文标题:java 解决Hash冲突的办法

          本文链接:https://www.haomeiwen.com/subject/aucjoctx.html