HashMap的负载因子 实现原理

NGU_ALLIN 2018-06-27 10:53:13
关于负载因子的解释,不是很懂,为什么说负载因子越大, 散列表的装填程序越高,发生碰撞的机率就大,查询的时间就会变慢?

个人理解:负载因子越大,假如初始容量为16的话,负载因子为1 ,那能用的空间就有16个,在添加元素的时候,就会 散列的更均匀了,怎么会发生碰撞机率大呢?求大牛们解释一二?
...全文
1011 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leslie_125 2021-07-05
  • 打赏
  • 举报
回复

建议楼主研究一下什么是hash冲突,
一个班有12个学生 和 一个班有16个学生,哪个班的学生同名率更高呢? 同名率高了是不是老师点名比较麻烦?

qq_39936465 2019-02-20
  • 打赏
  • 举报
回复
引用 6 楼 weixin_38368556 的回复:
因为装填因子到0.75的时候,底层存储数组就开始扩容了,成倍扩容成32个大小,此时里面装有12元素,在状态四个元素的时候他的可选空间就是32-12了


5楼说的是32-12 应该等于20,3楼这里写错了。
it-partner 2019-02-19
  • 打赏
  • 举报
回复
因为装填因子到0.75的时候,底层存储数组就开始扩容了,成倍扩容成32个大小,此时里面装有12元素,在状态四个元素的时候他的可选空间就是32-12了
国服第一中单 2019-02-01
  • 打赏
  • 举报
回复
那么问题来了,为什么32-12=24?
NGU_ALLIN 2018-06-28
  • 打赏
  • 举报
回复
[quote=引用 3 楼 stacksoverflow 的回复:]
情况1:假设容量16,装填因子为0.75,也就是装入12个元素后,就开始扩容
情况2:假设容量16,装填因子为1,也就是装入16个元素后,就开始扩容

我们来分析一下对于16个数字在hashMap中的存取过程
情况1:
对于前12个元素,我们需要根据hash函数将他们分布在容量为16的区域内,假设没有冲突,这样占了12个存取空间。
然后开始扩容,假设容量扩到了32。
对于第12到第16个元素,我们需要根据hash函数将他们分布在容量为32-12=24的区域内。
也就是把4个元素分布到24个区域内。

情况2:
对于前12个元素,我们需要根据hash函数将他们分布在容量为16的区域内,假设没有冲突,这样占了12个存取空间。
装填因子为1,到16个元素才开始扩容,所以没有扩容
对于第12到第16个元素,我们需要根据hash函数将他们分布在容量为16-12=4的区域内。
也就是把4个元素分布到4个区域内。

总结
对于第12到第16个元素,把4个元素分布到24个区域内显然比把4个元素分布到4个区域内发生的碰撞几率要。[/quoten
嗯,这块说的很中肯!
stacksoverflow 2018-06-28
  • 打赏
  • 举报
回复
情况1:假设容量16,装填因子为0.75,也就是装入12个元素后,就开始扩容
情况2:假设容量16,装填因子为1,也就是装入16个元素后,就开始扩容

我们来分析一下对于16个数字在hashMap中的存取过程
情况1:
对于前12个元素,我们需要根据hash函数将他们分布在容量为16的区域内,假设没有冲突,这样占了12个存取空间。
然后开始扩容,假设容量扩到了32。
对于第12到第16个元素,我们需要根据hash函数将他们分布在容量为32-12=24的区域内。
也就是把4个元素分布到24个区域内。

情况2:
对于前12个元素,我们需要根据hash函数将他们分布在容量为16的区域内,假设没有冲突,这样占了12个存取空间。
装填因子为1,到16个元素才开始扩容,所以没有扩容
对于第12到第16个元素,我们需要根据hash函数将他们分布在容量为16-12=4的区域内。
也就是把4个元素分布到4个区域内。

总结
对于第12到第16个元素,把4个元素分布到24个区域内显然比把4个元素分布到4个区域内发生的碰撞几率要
NGU_ALLIN 2018-06-28
  • 打赏
  • 举报
回复
没有大牛们,给指导一下吗?
NGU_ALLIN 2018-06-27
  • 打赏
  • 举报
回复
自顶一下!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧