简述hashmap原理

我们知道 数组 在存储上具有占用空间合理,物理地址排列紧密,并且查找迅速的特点,而链表这种数据结构 则是比较占空间,查询困难,但是修改成本比较低,而 hashmap 则是 兼顾 数组 和 链表 两者的优势,极大的增加了数据 查询和修改的性能。

hashmap 存储元素步骤 

  • 当我们调用 hashmap的put方法时,首先会根据key值计算出一个hashcode值,这个就是 hashmap中键值队数组table[]的下标。
  • 我们需要首先判断 hashmap的table[].length是否为0,如果为0需要扩容。
  • 判断是否需要扩容后,我们根据hashcode定位到bucket,如果这个bucket是null,那么直接写入,否则走下一步。
  • 如果在这个“桶”里有值了, 那么需要调用key.equals方法,判断key是否为同一个对象,如果相同,则覆盖写入,如果equals方法返回 false, 那么产生hash碰撞,判断当前的存储结构,如果是红黑树结构那么直接插入,如果是链表结构,那么判断链表长度是否大于8,如果小于等于8,则插入链表,如果大于8则转为红黑树结构存储。
  • 最后,在新元素添加成功后,计算hashmap中的元素数量是否超过了 threshold (threshold = capacity * loadFactor ),一般loadFactor = 0.75,即75%。capacity 为table[]的length,也就是说 当75%的bucket都有元素的时候,就需要扩容了。threshold为扩容阈值,loadFactor为负载因子。和ArrayList等集合类一样,在超过 这个阈值后,hashmap所有的bucket都要重新计算hashcode值,重新定位,一般是 开拓出原来空间的两倍,并rehash后重新落入,再把老的地址空间清空。

示意图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值