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

陆丰网站广州网站建设网站

陆丰网站,广州网站建设网站,国内ip地址免费,泰州网站建设案例文章目录 JDK7 vs JDK8 的 HashMap 结构变化Java8 中哈希表的红黑树优化机制HashMap 添加元素的完整流程解析1. 计算 key 的哈希值并确定索引2. 检查该索引位置是否已有元素3. 处理哈希冲突4. 判断当前存储结构(链表还是红黑树)5. 判断链表长度是否超过 …

文章目录

    • JDK7 vs JDK8 的 HashMap 结构变化
    • Java8 中哈希表的红黑树优化机制
    • HashMap 添加元素的完整流程解析
      • 1. 计算 key 的哈希值并确定索引
      • 2. 检查该索引位置是否已有元素
      • 3. 处理哈希冲突
      • 4. 判断当前存储结构(链表还是红黑树)
      • 5. 判断链表长度是否超过 8
      • 6. 触发扩容的判断
      • 7. 进行扩容
      • 8. 迁移元素
    • 流程图
    • 补充
      • HashMap 的初始容量与负载因子优化

JDK7 vs JDK8 的 HashMap 结构变化

在 JDK7 及更早版本,HashMap 采用 数组 + 链表 结构,当哈希冲突较多时,链表可能变得很长,导致查询性能从 O(1) 退化到 O(n)。

在 JDK8,为了优化链表查询性能,引入了红黑树

  • 仍然采用 数组 作为底层存储。
  • 当某个桶中的链表长度 超过 8,并且 table 的大小 ≥ 64 时,链表转换为 红黑树
  • 这样,在极端情况下,查询性能从 O(n) 降低到O(log n)

Java8 中哈希表的红黑树优化机制

从JDK8开始,为了优化哈希冲突情况下的查找性能,当哈希桶中的链表长度超过 8 时,链表会转换为红黑树。红黑树是一种自平衡二叉搜索树,将最坏情况下的查找复杂度从 O(n) 降低到 O(log n)。(如果没引入红黑树,则最坏查找复杂度是O(n))

当树中元素数量低于 6 时,红黑树会退化回链表,以减少不必要的树操作开销,提高小规模数据场景下的性能。

HashMap 添加元素的完整流程解析

1. 计算 key 的哈希值并确定索引

  • 通过 key.hashCode() 计算出哈希值。
  • 采用 (哈希值 & (table.length - 1)) 计算索引,以确定 key 应该存放在 table 数组中的那个位置。

2. 检查该索引位置是否已有元素

  • 如果该索引位置为空table[index] == null),说明当前 key 没有发生哈希冲突,直接存入该位置,并检查是否需要扩容。【在 HashMap 里,负载因子(loadFactor)默认值是 0.75,表示当元素个数达到 容量 * 0.75 时,就会触发扩容】
  • 如果该索引位置已有元素,说明发生了哈希冲突,进入下一步处理。

3. 处理哈希冲突

在索引位置已有元素的情况下,需要判断该 key 是否已经存在:

  • 如果 key 与已有节点的 key 相同,说明是更新操作,直接替换 value
  • 如果 key 不同,说明该索引位置是个链表或红黑树,需要进一步处理。

4. 判断当前存储结构(链表还是红黑树)

  • 如果该索引处存储的是红黑树,按照红黑树的插入规则执行插入操作,流程结束。
  • 如果是链表,则遍历链表:
    • 如果链表中存在相同的 key,则更新 value,流程结束。
    • 如果链表中没有相同 key,则在链表末尾插入新节点,并继续下一步处理。

5. 判断链表长度是否超过 8

  • 如果链表长度 ≤ 8,不做额外处理。
  • 如果链表长度 > 8,则需要判断是否转换为红黑树:
    • 如果 table 长度 >= 64,则将链表转换为红黑树,流程结束。
    • 如果 table 长度 < 64,则不转换为红黑树,而是触发扩容(见步骤 7)。

6. 触发扩容的判断

在完成插入后,需要判断是否需要扩容:

  • size >= 阈值(threshold = table.length * 0.75) 时触发扩容。
  • 扩容是基于整个 HashMap 的大小,而不是单个链表的长度,即使单个链表过长,也不会单独扩容,而是考虑整体 size

7. 进行扩容

  • 扩容策略table 容量翻倍(如 16 → 32,32 → 64)。
  • 调整扩容阈值:新阈值 = 新容量 * 0.75
  • 重新计算 key 的索引
    • 由于 table.length 发生变化,所有 key 需要重新计算索引并迁移到新的 table
    • HashMap 采用高位 & 低位拆分的方式优化了 rehash 过程,使得某些 key 的新索引保持不变,而另一些 key 需要移动到新位置。

8. 迁移元素

  • table 的数据逐个迁移到新 table
  • 迁移规则
    • 计算 oldIndex = hash & (oldCapacity - 1)newIndex = hash & (newCapacity - 1)
    • 低位不变,高位索引变化,减少数据迁移的计算量。

流程图

在这里插入图片描述


补充

HashMap 的初始容量与负载因子优化

HashMap 的默认初始容量为 16负载因子为 0.75,这一组合在性能与空间之间取得了平衡。较高的负载因子(如 1.0)可减少空间浪费,但会增加哈希冲突的概率;较低的负载因子则减少哈希冲突,但会增加内存开销。 (如果可预估 HashMap 的存储需求,建议提前设置合适的初始容量,以减少动态扩容带来的性能损耗。)

❤觉得有用的可以留个关注~~❤


文章转载自:

http://Gdo37i1p.xtyyg.cn
http://TSGaQVBE.xtyyg.cn
http://SJkCucTY.xtyyg.cn
http://5GEHYM9v.xtyyg.cn
http://j54vGdi0.xtyyg.cn
http://I3kmlPRG.xtyyg.cn
http://BmEKAB7b.xtyyg.cn
http://mt4svUgU.xtyyg.cn
http://5TR7UxGG.xtyyg.cn
http://nhi2XEGq.xtyyg.cn
http://9aurZNty.xtyyg.cn
http://sHnVzVU1.xtyyg.cn
http://k4Yq0YEZ.xtyyg.cn
http://gedSBMTn.xtyyg.cn
http://GgBVuhLT.xtyyg.cn
http://K4DvaXOX.xtyyg.cn
http://MhdvcFL9.xtyyg.cn
http://UwobFwRs.xtyyg.cn
http://K23iRyPE.xtyyg.cn
http://NOmHllja.xtyyg.cn
http://ubmwT9Ef.xtyyg.cn
http://5WxtmRMi.xtyyg.cn
http://CYgry5DN.xtyyg.cn
http://Km39YSbc.xtyyg.cn
http://0M95e2C9.xtyyg.cn
http://XCWshuIt.xtyyg.cn
http://5fMqiKuR.xtyyg.cn
http://XscoLchF.xtyyg.cn
http://D7kL79NM.xtyyg.cn
http://SWWtv1ad.xtyyg.cn
http://www.dtcms.com/wzjs/726169.html

相关文章:

  • 优化推广网站seo音乐网站样式设计
  • 怎么创建公司的个人网站做国外贸易哪个网站好
  • 各大网站图片wordpress的文件说明
  • 中小企业建网站注意中国建筑集团有限公司是国企吗
  • 咨询类网站开发的意义wordpress 标题
  • 俄文网站策划有0元开网店的吗
  • 手机网站模版更换技巧装饰设计风格
  • 一屏网站模板下载 迅雷下载 迅雷下载地址网络技术有限公司是干啥的
  • 小说网站自主建设盐城网盐城网站建设站建设
  • 增城免费网站建设定制开发网站的公司
  • 凡科网站网站建设进不去云南文山州
  • 鲜花网站建设目的有特效的网站
  • 新市区做网站wordpress 自定义翻页
  • 主流网站宽度wordpress 4.0
  • 怎么给公司免费做网站网站顶端大图怎么做
  • 个性化网站定制前端跟后端哪个就业难
  • 老板让我做网站负责人如何让百度抓取网站
  • 达人设计网官方网站网站修改标题
  • wordpress缓存插件破解版商丘seo
  • 千度网站哪个企业做网站
  • 建设工程造价员网站网站建设商标保护
  • 团购鲜花的网站建设海口网站建设品牌大全
  • 济南网站开发设计泰州网站制作工具
  • 建设济南公司网站如何注册公司名称
  • 国外做彩票网站推广是合法的吗wordpress响应速度太慢
  • 网站开发参数青海汽车网站建设
  • 想用自己电脑做服务器做个网站吗宁波市住房和城乡建设局网站
  • 修改网站的设计易雅达网站建设公司
  • 郑州网站推广公司价格厦门百度开户
  • 制作公司网站哪个好建工网校怎么样