HashMap中相同桶中的hash值不一定相同

HashMap的put方法会根据放入对象的hash值和底层桶的数量去计算放入的位置,源码中是根据对象的hash值和桶的数量-1做与运。这其实和取模运算差不多,而桶的数量只能是2的n次方是为了使与运算和取模运算的结果近似相同。所以不同的hash值在经过计算之后可能位于相同的桶中(hash冲突后形成链表或红黑树)。能证明这个观点的最佳方式是将加载因子调整到大于1的数值,hash值不同的对象放入了相同的桶中。

举例:创建一个初始容量为16,加载因子为1.5F的HashMap。根据threshold = (capacity * loadFactor),HashMap的实际容量是根据桶的数量乘以加载因子,所以这个HashMap的实际容量为24。而我们将字符串1-24作为key放入map中时会观察到11、22在一个组,1、12、23在一个组。。。这是因为按正常想法一个桶数量只有16的HashMap如何存放24个元素,只能有一部分元素接受hash冲突,而这部分元素的hash值不相等,但是他们与运算之后的位置相同,所以被放在了一个桶中,形成链表或红黑树。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值