链地址法实现HashMap的put方法

1.HashMap的存储结构:数组+链表

2.创建这样一个类型的对象

  //创建一个节点类,数据域是一个Entry类型的键值对
    static class Node<K,V>{
       private Entry<K,V> value;
        private Node<K,V> next;

        public Node(Entry<K, V> value) {
            this.value = value;
        }
        //创建一个Entry类
        static class Entry<K,V>{
            private K key;
            private V value;
            public Entry(K key, V value) {
                this.key = key;
                this.value = value;
            }
        }
    }

 3.自定义对象及其一些属性值

   private Node[] element;
   private final double LOADFATOR=0.75;//扩容因子
   private int Node_size;//插入节点的个数
   private int array_size;//元素所占数组的实际长度
   private final int INTSIZE=16;//数组大小默认设定为16

4.put方法的具体实现

public void put(K key, V value) {
        //判断是否该扩容
        if ((double)array_size/element.length>LOADFATOR){
            Node<K,V>[] newelement=new Node[element.length*2];
            rehash(newelement);
            element=newelement;
        }
        //求hashcode值,确定数据存放的位置
        int index=key.hashCode()%element.length;
        if (element[index]==null){
            array_size++;//数组的占用个数
        }
        //键相同值覆盖
        Node.Entry<K,V> entry=containKey0(key);
        if (entry!=null){//找到键所对应的值,并替换掉
            entry.value=value;
            return;
        }else {
            Node.Entry<K, V> entry1 = new Node.Entry<>(key, value);
            Node<K, V> node = new Node<>(entry1);
            node.next = element[index];//把node节点的下一个位置指向element[index]保存的地址
            element[index] = node;//让element[index]保存现在node的地址
            Node_size++;
        }

    }

5.如果当前占用的实际数组大小/数组大小 > 0.75 就需要进行重新hash

private void rehash(Node<K,V>[] array){
        array_size=0;
        int index ;
        //把原来数组中的数据在新的数组中进行重新定位
        for (int i = 0; i <element.length; i++) {
            while (element[i]!=null){
                Node<K,V> p=element[i];//p变量用来实现节点的删除和在新数组中的插入
                element[i]=element[i].next;//把p独立出来
                int newIndext=p.value.key.hashCode()%array.length;
                if (array[newIndext]==null){//数组当前位置为空,则数组被占的实际大小加一
                    array_size++;
                }
                 //头插法
                p.next=array[newIndext];
                array[newIndext]=p;
            }
        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMap的put方法是用来将键对存储到HashMap中的。在put方法中,首先通过hash(key)计算出要存储的位置,然后调用putVal方法来实际执行插入操作。\[1\] 在putVal方法中,首先判断要插入的位置是否已经存在元素。如果该位置为空,则直接将键对存储在该位置上。如果该位置已经存在元素,则需要根据具体情况进行处理。 如果该位置上的元素是一个链表,则需要遍历链表,查看是否存在与要插入的键相同的键。如果存在相同的键,则更新对应的;如果不存在相同的键,则将新的键对添加到链表的末尾。同时,还需要判断链表的长度是否达到了阈,如果达到了阈,则将链表转换为红黑树。\[2\] 如果该位置上的元素是一个红黑树节点,则将要插入的键对封装成一个红黑树节点,并添加到红黑树上。在添加过程中,还会判断红黑树中是否已经存在相同的键,如果存在,则更新对应的。\[3\] 总结起来,HashMap的put方法会根据键的哈希计算出存储位置,然后根据具体情况进行插入操作,包括直接存储、链表插入和红黑树插入。 #### 引用[.reference_title] - *1* *2* [HashMap中put方法详解](https://blog.csdn.net/lubiaojava/article/details/119780055)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [HashMap的put方法](https://blog.csdn.net/AAAWell/article/details/125898104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值