HashMap 获取 Hash 值时进行位运算的原因

HashMap 中获取 Hash 值的方法

 首先判断 key 是否为 null,为 null 则返回 0 ,所以 key 为空的元素对应的数组坐标一定是 0,而且根据 put 会覆盖相同 key 的逻辑来思考,key 为空的元素最多只有一个。不为 null 则返回 key 的 hashCode异或上它的高16位。

static final int hash(Object key) {
   
    int h;
    return (key == null) ? 0 : (h 
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在HashMap扩容时,不需要重新计算hash。在扩容时,HashMap会创建一个更大的数组,然后把原数组中的元素重新分配到新数组中。在这个过程中,HashMap会根据新数组的大小重新计算每个元素的索引位置,然后把元素放到新的位置上。这个过程中,元素的hash不会改变,只是重新计算了它的索引位置。 ### 回答2: 在HashMap扩容时,不需要重新计算所有的hashHashMap是通过hash来确定元素在数组中的位置的。当HashMap进行扩容时,其内部会创建一个更大的数组,并将原有的元素重新放入新的数组中。由于新的数组大小发生了改变,所以不能简单地将元素按原来的hash放入新的数组中,需要重新计算元素的hash来确定在新数组中的位置。 然而,并不需要重新计算所有的hash。因为在HashMap的扩容过程中,并不会改变元素的hashCodehashCode是不变的。只需要根据新数组的大小重新计算每个元素在新数组中的位置即可。 扩容时,HashMap会将原数组中的每个元素取出,重新计算其在新数组中的位置,然后将其放入新数组对应的位置。这个位置的计算方法是:使用元素的hashCode与新数组的长度进行取模运算,以确定元素在新数组中的位置。 这样做的目的是为了保证HashMap能够在扩容后仍然能够保持较低的冲突率,实现较好的性能。因为新数组的长度更大,分布更均匀,可以降低元素之间发生冲突的概率。 总结来说,在HashMap扩容时,并不需要重新计算所有的hash,只需要重新计算每个元素在新数组中的位置即可。这样可以保证在扩容后,HashMap仍然能够保持较好的性能和较低的冲突率。 ### 回答3: 在HashMap进行扩容时,是需要重新计算hash的。 HashMap的扩容是通过增加桶的数量来实现的。当HashMap中的元素数量超过了负载因子(默认为0.75)与当前桶数量的乘积时,就会触发扩容操作。扩容时会创建一个新的桶数组,并将原始桶数组中的元素重新分配到新桶数组中。 在重新分配元素时,需要计算每个元素的新的hash。原始桶数组中的节点,根据其原始hash的高位和新桶数量的与运算结果来确定新的桶的索引位置。通过重新计算hash,可以保证在新的桶数组中,元素能够均匀地分布在不同的桶中,避免出现过多的冲突,提高HashMap在查找、插入和删除操作上的性能。 因此,在HashMap进行扩容时,需要重新计算hash,以实现元素的均匀分布。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值