网站首页 > 开源技术 正文
在JDK 1.8中,最为经典的改动就是对HashMap的改动,当链表中元素数量超过一定阈值时,默认情况下是8的时候,将链表结构转换为红黑树,这一改动的原因主要是为了提高性能,尤其是在处理大量哈希冲突时,能更好地保证较优的时间复杂度。下面我们就来详细介绍一下HashMap为什么要进行这样的改动。
优化最坏情况下的查找性能
在JDK 1.8 之前HashMap的存储是采用了数组 + 链表的方式来存储数据。当多个键的哈希值相同的时候,就有可能会产生大量的哈希冲突,它们会被存储在同一个桶中,形成一个链表。
在理想的情况下,哈希冲突少,链表的长度较短,查找性能接近 O(1)。但是在最坏情况下,如果发生大量哈希冲突,链表长度变长,查找的时间复杂度将退化到 O(n),这对性能是非常不利的。
所以在JDK1.8之后,引入了红黑树,红黑树是一种自平衡二叉搜索树,它能保证在最坏情况下仍然有较好的性能表现。当链表长度超过阈值时,链表会自动转换成红黑树,这样可以将最坏情况下的查找、插入和删除操作的时间复杂度从 O(n) 降低到 O(log n)。
提升哈希冲突严重时的性能
在某些极端情况下,当我们用到的哈希函数设计不巧妙的时候,或者是有人故意构造具有相同哈希值的键,这个时候HashMap的存储性能将会急剧下降,而引入红黑树之后,则可以大大缓解这种情况。
即使发生大量哈希冲突,性能也不会退化到线性级别。对于大数据量的应用场景,这种优化能明显提高 HashMap 的稳定性和性能。
平衡了空间和时间的消耗
使用红黑树相比链表会有额外的空间开销,例如要存储红黑树的父节点信息、颜色信息等,但是这个空间开销相对来说是可控的,因为只有当链表的长度超过 8 时才会转换为红黑树,在小于8的时候,还是用链表存储。
而且,对于大多数使用场景,哈希冲突是较少的,链表结构依然能很好地工作,因此并不会导致整体内存消耗的大幅增加。
简化维护和优化代码
红黑树的引入,同时也简化了对于HashMap的在处理哈希冲突时的代码优化工作,开发人员不需要手动的对HashMap中的键值冲突进行处理,因为JDK自身的实现能够自动适应不同的冲突情况,保证了高效和稳定的性能表现。
总结
JDK 1.8 对 HashMap 引入红黑树的改动,主要目的是提升在哈希冲突严重时的性能,特别是避免最坏情况下时间复杂度退化到 O(n)。这种改动平衡了时间复杂度和空间消耗,使 HashMap 在处理大量数据和复杂哈希冲突时仍能保持较优的性能。
猜你喜欢
- 2024-09-28 程序员:JDK的安装与配置(完整版)(jdk软件安装教程)
- 2024-09-28 惊了,JDK都到23了,据说还有99%Java程序员都不会用optional?
- 2024-09-28 大数据分析:学习工具JDK,在线安装指南
- 2024-09-28 JDK 14 调试神器了解一下?| 原力计划
- 2024-09-28 下个月,java要开启收费模式了,你怕了吗?
- 2024-09-28 JDK11升级JDK17最全实践干货来了(jdk11版本)
- 2024-09-28 JDK、JRE和JVM的区别与相互之间的联系
- 2024-09-28 Fury:一个基于JIT动态编译的高性能多语言原生序列化框架
- 2024-09-28 JDK 各版本(1~14)特性总结(jdk各个版本发布时间表)
- 2024-09-28 探索Java的起点:JDK是什么以及如何选择适合你的版本
你 发表评论:
欢迎- 03-19基于layui+springcloud的企业级微服务框架
- 03-19开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- 03-19SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- 03-19SpringBoot+LayUI后台管理系统开发脚手架
- 03-19layui下拉菜单form.render局部刷新方法亲测有效
- 03-19Layui 遇到的坑(记录贴)(layui chm)
- 03-19基于ASP.NET MVC + Layui的通用后台开发框架
- 03-19LayUi自定义模块的定义与使用(layui自定义表格)
- 最近发表
-
- 基于layui+springcloud的企业级微服务框架
- 开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- SpringBoot+LayUI后台管理系统开发脚手架
- layui下拉菜单form.render局部刷新方法亲测有效
- Layui 遇到的坑(记录贴)(layui chm)
- 基于ASP.NET MVC + Layui的通用后台开发框架
- LayUi自定义模块的定义与使用(layui自定义表格)
- Layui 2.9.11正式发布(layui2.6)
- Layui 2.9.13正式发布(layui2.6)
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)