HashMap的put方法

HashMap的底层实现主要基于哈希表、链表和红黑树。在JDK 1.8及以后的版本中,HashMap的底层数据结构是一个数组和链表/红黑树的结合体。

数组:HashMap使用一个数组来存储桶(Bucket),每个桶可以存储一个或多个键值对。数组的长度总是2的幂次方,这是为了优化哈希计算的性能。

链表:当多个键值对的哈希值相同(即发生哈希冲突)时,这些键值对会被存储在同一个桶中的链表中。链表的使用解决了哈希冲突的问题,但当链表过长时,查找效率会下降。

红黑树:在JDK 1.8中,当链表长度超过一定阈值(默认为8)且数组长度大于64时,链表会被转换为红黑树。**红黑树是一种自平衡的二叉查找树,它的查找、插入和删除操作的时间复杂度都是O(log n),这有助于提高HashMap在链表较长时的性能。

哈希计算:HashMap使用哈希函数来计算键的哈希值,并根据哈希值来确定键在数组中的位置(即桶的索引)。为了减少哈希冲突,HashMap的哈希函数会尽量将哈希值分布得更加均匀。

**扩容机制:当HashMap中的元素数量超过阈值(容量负载因子,默认为16*0.75=12)时,HashMap会进行扩容。**扩容时,会创建一个新的数组,并将旧数组中的元素重新计算哈希值后存储到新数组中。扩容是一个相对耗时的操作,因为它需要重新计算所有元素的哈希值并重新分配存储位置。

HashMap中的put方法确实展现了其底层的部分实现细节,但并不能完全展示整个HashMap的底层结构和所有操作。不过,通过put方法的执行流程,我们可以理解HashMap是如何处理键值对的存储、哈希冲突以及动态扩容等关键操作的。

1.计算key的hash值,使用hashcode()方法计算其哈希值。
在这里插入图片描述
在这里插入图片描述
2.定位数量索引
通过哈希值和数组长度计算出一个索引值,找到添加元素存放位置,并判断此位置是否已有元素,如果没有则可直接存放
在这里插入图片描述

3.处理哈希冲突

如果该索引处为空,则直接在该位置创建一个新的节点存储键值对。
如果该索引处已经存在节点(即哈希冲突),则遍历链表或红黑树:
在这里插入图片描述
如果链表中已存在相同的键,则替换旧值。
在这里插入图片描述

4.调整数组大小

当链表长度超过一定阈值(默认为8)且数组长度大于64时,链表会被转换为红黑树。进行扩容。数组的长度变为原来的2倍,阈值也按2倍扩容。
在这里插入图片描述
在这里插入图片描述
另一种情况是数组中的元素个数大于扩容阈值,也会进行扩容,此时的扩容与上面相同,也是两倍扩容。

在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值