当前位置: 首页 > news >正文

HashMap为什么扩容为原来2倍呢?

1、减少哈希碰撞

核心原因:HashMap的所有设计都依赖于数组长度为2的幂次方这一前提。

  • 索引计算使用 (n-1)&hash ,其中 n 是数组长度
  • 当 n 是 2 的幂次方时,n-1 的二进制形式是全 1(例如,15——>1111)
  • 这使得哈希分布更均匀,减少哈希碰撞概率
  • 扩容为 2 倍能保证新容量仍然是 2 的幂次方
原始容量16: n-1=15 (1111)
扩容后32: n-1=31 (11111)

2、优化元素迁移效率(JDK1.8改进)

  • 元素的新位置只有两种可能:
    • 保持原位置不变
    • 原位置 + 原容量

为什么呢?

新索引 = e.hash & (newCap - 1)

由于newCap = oldCap << 1,newCap - 1 比 oldCap - 1 多一个高位1

所有只需要看 e.hash 新增的高位是0还是1:

0则索引不变

1则索引  = 原索引 + oldCap

实现优势:

  • 无序重新计算hash值
  • 只需一次位判断即可确定新位置
  • 迁移时间复杂度从 O(n) 减低到 O(1)
元素hash值: ... 0001 1101 (低4位1101=13)
oldCap=16(10000), newCap=32(100000)
判断第5位(从右数第5位):
如果是0: 新位置仍然是13
如果是1: 新位置是13+16=29

相关文章:

  • 栈和队列详细讲解
  • HDCP(五)
  • 【进程通信】 Linux下使用共享内存实现跨进程通信:基于C++的完整示例
  • rancher 采用ingerss ssl 部署nginx+php项目
  • c# 使用NPOI将datatable的数据导出到excel
  • OSPF不规则区域和LSA
  • 【Java学习】AI时代下如何学习Java语言开发
  • 【算法学习计划】回溯 -- 记忆化搜索
  • StringTemplate修仙指南:字符串处理的“言出法随“大法
  • 智能物联网网关策略部署
  • vue3+vite+js项目引入electron构建跨平台桌面应用
  • Excel 自动执行全局宏
  • 项目进度延误的十大原因及应对方案
  • 4-10记录(
  • 聊天室项目Day3之服务器的http的get和post回复实现
  • 软件信息安全性测试如何进行?有哪些注意事项?
  • 神经网络入门—自定义神经网络续集
  • 2. 单词个数统计
  • WPS JS宏编程教程(从基础到进阶)-- 第六部分:JS集合与映射在 WPS 的应用
  • 关于使用@Slf4j后引入log,idea标红解决办法
  • 做虚拟货币交易网站/五种关键词优化工具
  • 做网站的算什么行业/网站建设图片
  • 优秀网站模板/网站搭建费用
  • 独立做网站前后端/一般的电脑培训班要多少钱
  • 适合权重小的网站做的专题/辅导班培训机构
  • 巴中网站建设/上海seo服务外包公司