Hashmap的put的底层原理

Hashmap的put的底层原理

HashMapput方法主要用于向HashMap中添加键值对。其具体流程如下:

  1. 首先,根据键的hashcode计算出在HashMap内部数组中的索引位置。

  2. 然后,检查该位置是否已经存在其他元素,如果不存在,则直接将新的键值对存储在该位置。

  3. 如果该位置已经存在其他元素(可能是单个元素或者链表、红黑树等数据结构),则需要比较键的hashcode和实际值来判断是否是同一个键。若为同一个键(遍历链表或者红黑树就可以判断key是否重复),则覆盖原先的value值,如果不是同一个键,且发生了碰撞(即多个键映射到了同一个索引位置),则根据具体情况采取不同的解决方案:

  • 如果发生了碰撞且使用的是链表存储冲突元素,会将新元素追加到链表末尾;

  • 如果发生了碰撞且链表长度超过阈值,会将链表转换为红黑树存储冲突元素;

  • 如果发生了碰撞且使用的是红黑树存储冲突元素,会按照红黑树的规则进行插入操作。

  1. 最后,如果插入成功,则更新size计数器,并根据需要进行扩容操作。
  2. size为数组中真正存在的键值对数目

若size超过数组大小*加载因子,则进行扩容操作

以上就是HashMapput方法的大致流程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMap的put操作用于向HashMap中插入键值对。其底层实现原理主要包括以下几个关键步骤: 1. 计算键的哈希值:首先,对于给定的键,HashMap会调用其hashCode()方法计算出对应的哈希值。哈希值是一个整数,用于确定该键值对应的存储位置。 2. 计算桶索引:根据哈希值和当前数组容量,通过位运算得到键值对应的桶索引。具体计算方式是:(n - 1) & hash,其中n为数组容量。 3. 查找桶:根据计算得到的桶索引,HashMap会定位到对应的桶位置。 4. 插入或更新:在对应的桶中进行插入或更新操作。如果桶中已经存在其他键值对,HashMap会遍历链表或红黑树(如果已经转换为红黑树)进行查找。如果找到具有相同键的节点,则更新其对应的值;如果没有找到,则将新的键值对插入到链表或红黑树的末尾。 5. 判断是否需要扩容:在插入或更新操作后,HashMap会判断当前元素个数是否超过负载因子与数组容量的乘积。如果超过,则触发扩容操作。 6. 扩容:扩容操作会创建一个新的数组,并将原有的键值对重新计算哈希值后放入新数组中。扩容操作会涉及到数组的重新分配和重新计算哈希值,以保持较低的散列冲突概率。 通过这些步骤,HashMap的put操作可以高效地将键值对插入到HashMap中。需要注意的是,如果键已经存在,则会更新对应的值;如果键不存在,则会将新的键值对插入到HashMap中。同时,HashMap还会根据负载因子进行自动扩容,以保证较低的散列冲突概率和高效的操作性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值