• 「数据结构」哈希表2:实现哈希表


    🎇个人主页Ice_Sugar_7
    🎇所属专栏Java数据结构
    🎇欢迎点赞收藏加关注哦!

    🍉扩容

    在讲插入之前需要先了解扩容,因为插入后载荷因子如果超过阈值,那我们就要扩容,即扩容是插入操作的一部分

    扩容后,原先哈希表中的元素的哈希地址会改变。之前会发生哈希冲突的元素可能扩容后就不会了
    比如数组初始长度为10,hash(key) = key % capacity,那么key为1和key为11的元素会冲突。现在扩容后长度为20,key为11的元素就会到下标为11的位置

    扩容的思路为:遍历所有节点,重新计算每个节点的地址,并插入到对应位置

        private void resize() {
            Node[] newArray = new Node[array.length*2];
            for(int i = 0;i < array.length;i++) {
                Node cur = array[i];
                //遍历链表
                while(cur != null) {
                    Node tmp = cur.next;  //先保存 cur 的下一个节点,不然头插后会找不到它
                    int newIndex = i % newArray.length;
                    //采用头插法 插入到新数组的 newIndex下标
                    cur.next = newArray[newIndex];
                    newArray[newIndex] = cur;
                    cur = tmp;
                }
            }
            array = newArray;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    🍉插入

    插入之前得先检查key是否已经存在,如果已经有了,则只需更新它的value

        public void put(int key, int value) {
            int hash = key % array.length; //计算地址
            Node cur = array[hash];
            while(cur != null) {  //先找一下key是否已经存在,若已经存在,则更新它的value就可以了
                if(cur.key == key) {
                    cur.value = value;
                    return;
                }
                cur = cur.next;
            }
            //到这里说明没找到key,那么就创建新节点,然后头插
            Node node = new Node(key,value);
            node.next = array[hash];
            array[hash] = node;
            size++;
            if(size*1.0 / array.length > LOAD_FACTOR) {
                resize();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    🍉获取value

    这个操作很简单,直接上代码:

        public int get(int key) {
            int hash = key % array.length;
            Node node = array[hash];
            
            while(node != null) {
                if(node.key == key)
                    return node.value;
                node = node.next;
            }
            
            return -1;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    🍉源码

    源码放在gitee仓库了,详情可看下面链接:
    实现哈希表

  • 相关阅读:
    搜索排序技术简介
    D-Star 寻路算法
    【CAS:2306109-91-9 |胺-PEG4-脱硫生物素】价格
    DedeCMS整合百度ueditor编辑器
    EasyExcel:简单读取本地文件
    零信任SPA工作流程 已完成未发布
    BP神经网络算法基本原理,bp神经网络算法的优点
    pdf文件打开后部分文字无法显示
    RocketMQ快速实战以及集群架构详解
    kafka原理与应用
  • 原文地址:https://blog.csdn.net/Ice_Sugar_7/article/details/136113657