Java1.8之HashMap底层链表变红黑树浅析

HashMap 常见问题Java8(扩容、转红黑树、退化链表、Hash优化) HashMap扩容 HashMap HashMap树化 HashMap退化链表 HashMap hash优化 HashMap put过程 HashMap 转红黑树条件 HashMap 循环异常 ConcurrentModificationException 红黑树、链表 阅读详情

HashMap底层链表变红黑树浅析

全文浏览约10分钟,从一个错误的结论分析到HashMap链表转化为红黑树的原因。读完对HashMap底层会有更深的理解。

广为流传的错误结论

  • 众所周知,Java1.8以后HashMap链表长度大于8数组长度大于64时,链表变为红黑树。

  • 网络上有一种错误说法流传甚广,请看分析:

      - 链表查找的时间复杂度:分为头查找和尾查找,综合两种查找,时间复杂度是n/2
      - 红黑树查找的时间复杂度:log2n
      
      - 分析:当长度为8时,链表查找时间为:8/2 = 4,红黑树查找时间为:log8 = 3
        	 当长度为7时,链表查找时间为:7/2 = 3.5,红黑树查找时间为:log7 = 2.8
      - 结论:长度为8时红黑树明显快于链表
    
  • 以上是错误结论,没有弄清楚大O表示法的意义所在。

大O表示法

  • 大O表示法(时间复杂度):

     大O表示法 是一种特殊的表示法,指出了算法的速度有多快。
     谁在乎呢?实际上,你经常要使用别人编写的算法,在这种情况下,知道这些 算法的速度大有裨益。
    

    简单来说大O表示法用于数据量巨大时所需要的时间消耗。注意!!在数据量过低时,大O表示法没有意义!!!

大O表示法

真正的原因

请看HashMap源码
HashMap源码

  • HashMap源码里的一段注释,大概是说,Hash函数算出HashCode导致冲突的概率符合泊松分布。
  • 个人理解:当链表长度等于8时已经是非常小的小概率事件(0.00000006),而红黑树的维护本就有时间成本,所以为了效率当很不可能出现时(数据量很大时),才转化为红黑树,避免频繁维护红黑树、红黑树变为链表出现的消耗。

本文引用:
Java1.8 Hash、《算法图解》

不忘初心,技术改变世界

源码分析---HashMap中链表和红黑树的转换阈值 HashMap JDK1.8 以前HashMap的实现是 数组+链表 JDK1.8 开始HashMap的实现是 数组+链表+红黑树 JDK1.8以前,HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 从上图中可以看出,HashMap 底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个 HashMap 的时候,就会初始化一个数组。 JDK1.8后,HashMa... 阅读详情

相关推荐

深入解析Java 8中HashMap的底层原理

hashmap

zhuhai0613的博客 1093

HashMap中链表转为红黑树的条件

HashMap中链表转为红黑树的条件 HashMap的底层是元素为链表的数组。 转化条件 在JDK1.8之后,HashMap中的链表在满足以下两个条件时,将会转化为红黑树(即自平衡的排序二叉树): 1. 条件一 数组 arr[i] 处存放的链表长度大于8; 2. 条件二 数组长度大于64。 满足以上两个条件,数组 arr[i] 处的链表将自动转化为红黑树,其他位置如 arr[i+1] 处的数组元素仍为链表,不受影响 ...

qq_26896085的博客 1万+

为什么HashMap中链表转红黑树的阀值是8?

在JDK1.8以后,HashMap中引入红黑树,主要原因为: 当一个桶(Bucket)中的元素过度填充时,链表的查找效率将会大大下降,因此在适当的时候,转换链表为红黑树,可以在桶过度填充时提高查询效率。 那么,为什么HashMap中链表转红黑树的阀值是8? 通过阅读源码,我们可以在HashMap的源码中发现如下一段说明 /* * Implementation notes. ...

ch503922135的专栏 1946

JDK1.8之后HashMap在元素超过8的时候转红黑树结构

HashMap在初始时依然使用的是数组+链表的结构, 链表的复杂度为O(n),红黑树的复杂度为O(log(n)) 从这方面看可以直接使用红黑树来存储,但是并没有这么做,源码中已给出解释: 因为树形结构会比常规的节点结构占用多一倍的空间,只用当节点足够多的时候,才会转换为树形结构 另外,为什么会在链表长度等于8的时候才去转换成红黑? 源码上描述:使用分布良好的HashCode,节点...

xq7801821的博客 1455

从DC到DCG:手把手教你搭建物理感知综合流程(含DEF文件处理避坑指南)

本文详细介绍了从Design Compiler(DC)过渡到DC Topographical(DCT)和DC Graphical(DCG)的完整操作框架,特别针对DEF文件处理提供避坑方案。通过环境准备、工具升级、DEF文件处理、DCG综合配置等步骤,帮助开发者高效应对28nm以下工艺节点的物理感知综合挑战,显著提升时序收敛效率。

weixin_27966471的博客 377

AXI4协议之AXI4-Lite接口详解及实战

本文首先对AXI4总线协议进行了一个简单的介绍,然后使用vivado提供的模板创建了一个AXI4-Lite Master的接口,并生成了一个具有Master和Slave的代码实例,阅读该示例代码,进行修改后用于自己的项目。

高阶近似的博客 2万+

为什么java1.8 hashMap的数据结构是红黑树?

众所周知,java1.7的时候hashMap结构还是【数组+链表】,而在1.8版本结构变为了【数组+链表/红黑树】,当链表长度达到8时,自动转换为红黑树结构。那么为什么java1.8要对hashMap的数据结构中加入树呢? 答案:提高查找效率。此前hashMap中的数据采取【数组+链表】的存储结构,桶数组会将通过hash算法将key值计算得来的相同哈希值数据存储在对应的链表中,而随着链表的数据增多,在检索结点方面,性能会下降,因为链表虽然插入删除的时间复杂度是O(1),但它遍历的时间复杂度达到了O(n)。为

泯灭于众生,高歌于孤夜! 2978

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 595

JDK1.8以后的hashmap为什么在链表长度为8的时候变为红黑树

在JDK1.8以及以后的版本中,hashmap的底层结构,由原来单纯的的数组+链表,更改为链表长度为8时,开始由链表转换为红黑树,为何大刀阔斧的对hashmap采取这个改变呢,以及为何链表长度为8才转变为红黑树呢,下面结合源码一起来分析一下。 我们都知道,链表的时间复杂度是O(n),红黑树的时间复杂度O(logn),很显然,红黑树的复杂度是优于链表的,既然这么棒,那为什么hashmap为什么不直接就用红黑树呢,请看下图 源码中的注释写的很清楚,因为树节点所占空间是普通节点的两倍,所以只有当节点足够多

Lizhj的博客 4828

【部署】Kimi 接入OpenClaw完整步骤及关键注意事项

本文详细介绍了如何将Kimi AI接入OpenClaw系统的完整步骤。首先需确保环境满足OpenClaw版本要求和系统支持,然后通过配置向导完成本地网关设置和Kimi模型接入,包括API密钥配置。文章提供了详细的命令操作和界面截图指导,并重点说明了安全警告处理、服务状态检查、API密钥有效性验证等关键注意事项。最后还展示了Kimi流量消耗明细和问题排查方法,帮助用户顺利完成接入并解决常见问题。整个流程清晰明了,涵盖了从环境准备到最终验证的全部环节。

海兰 7169

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之EcuC模块配置详解(上)

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之EcuC模块配置详解(上)

weixin_42412049的博客 1529

HashMap-链表与红黑树转换触发条件

JDK1.8对HashMap进行了很多优化。例如当一个槽位slot上的链表个数达到转换成红黑树的条件,则会将链表转换为红黑树。当一个槽位slot上的红黑树节点个数低至转换成链表的条件,则会将红黑树转换为链表。访问节点方式:先找到节点所在的数组slot位置,然后判断节点是什么结构进行遍历。链next红黑树nextprevroot。

weixin_37607613的博客 8718

OpenCV-Python实战(11)——OpenCV轮廓检测相关应用

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,我们将学习如何利用获取到的轮廓,进行形状分析以及对象检测和识别。

盼小辉丶的博客 1万+

HashMap真的是大于8就转换成红黑树,小于6就变成链表吗???

这篇文章仅限小编个人的理解,小编不是Java方向的,只是对Java有很高的学习兴趣 如果有什么不对的地方还望大佬指点 QQ交流群: 99979568 HashMap的底层是数组+链表,(很多人应该都知道了) JDK1.7的是数组+链表 (1.7只是一个例子,以前的话也是这样后面就以1.7为例子了) 首先是一个数组,然后数组的类型是链表 元素是头插法 JDK1.8的是数组+链表 或者 数组+红黑树 首先是一个数组,然后数组的类型是链表 在链表的元素大于8的时候,会变成红黑树 在红黑树的元素小于6的时候会变.

日常发呆 2万+

2026华为OD机试真题 9月27日 新系统 【均衡调度】

华为OD机试真题 新系统 9月27号【均衡调度】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【均衡调度】多语言题解。

qq_45776114的博客 1759

VSCode + QMT 量化交易完整解决方案!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1326

为什么Java8中HashMap链表使用红黑树而不是AVL树

在Jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度。 那么很多人就有疑问为什么是使用红黑树而不是AVL树,AVL树是完全平衡二叉树阿? 最主要的一点是: 在CurrentHashMap中是加锁了的,实际上是读写锁,如果写冲突就会等待, 如果插入时间过长必然等待时间更长,而红黑树相对AVL树他的插入更快! 第一个问...

深度Java 3万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java中HashMap底层为什么是数组链表?

之前面试时问了HashMap的底层结构,详细见本人个人对HashMap和Hashtable底层实现的见解,入口如下: Java中HashMap与HashTable底层的联系与区别 之后被问到HashMap底层为什么是数组链表呢?这样的话,链表一长,在链表中查询的效率不是很低吗? 我:(哑了) 最近看到一个比较有依据的答案,在此做一下答复。 HashMap底层为什么是数组链表呢?在链表中查询的效率不...

龙套的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HashMap底层数据结构:数组 + 链表 + 红黑树

本文将从 “数据结构演进” 的视角,深度拆解 HashMap 的底层实现 —— 从 JDK 1.7 的 “数组 + 链表”,到 JDK 1.8 的 “数组 + 链表 + 红黑树”,带你搞懂每一种结构的作用、哈希冲突的解决逻辑,以及结构演进背后的性能优化思路。

y245166349的专栏 1861

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java1.8中HashMap原理(桶和桶内链表红黑树)

目录 一、HashMap介绍 二、HashMap原理图 三、桶的个数必定为2的n次幂 四、HashMap中的put方法 五、链表转红黑树 一、HashMap介绍 HashMap采用<Key,Value>键值对的形式存储数据,在提取数据时可以通过对key的比较得到对应的Value的值. 二、HashMap原理图 HashMap中存储数据是通过存入key的hash值进...

shenshaoming的博客 8853

Java面试-HashMap 的底层实现原理(JDK 8):数组 + 链表 + 红黑树

HashMap👋 欢迎阅读《Java面试200问》系列博客!🚀大家好,我是Jinkxs,一名热爱Java、深耕技术一线的开发者。在准备和参与了数十场Java面试后,我深知面试不仅是对知识的考察,更是对理解深度与表达能力的综合检验。✨本系列将带你系统梳理Java核心技术中的高频面试题,从源码原理到实际应用,从常见陷阱到大厂真题,每一篇文章都力求深入浅出、图文并茂,帮助你在求职路上少走弯路,稳拿Offer!🔍今天我们要聊的是:《准备好了吗?Let’s go!

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

HashMap为什么用链表加红黑树?目的是什么?原理是什么

关于HashMap的详解文章:链接: HashMap源码研究——源码一行一行的注释关于hashmap的其他有关问题我在源码研究专栏中都有讲解,深入到源码层次的讲解,绝对一看就懂 链接: 深入源码,探究设计思想在jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度。一句话回答: 用链表是为了应对哈希冲突这种情况的我们都知道hashmap是根据算得哈希值来确定数据存放的位置,但是我们也知道哈希值会一样,也就是哈希碰撞这种情况。 为了让哈希值一样的

想着百万年薪努力的小赵 2万+

java集合:HashMap的底层实现原理

HashMap的底层实现原理是面试中出现频率非常高的一道面试题,本文将对HashMap的底层实现原理做一个简要的概况和总结,便于复习。 一、对于Map集合存储结构的理解 首先介绍以HashMap为典型代表的Map集合的存储结构 ① Map中的key:无序的、不可重复的,底层使用Set集合存储key;key所在的类要重写equals()和hashCode() ② Map中的value:无序的、可重复的,底层使用Collection集合存储value;value所在的类要重写equa...

weixin_48016395的博客 2万+

【Java】说HashMap链表长度超过8就会转换成红黑树的出来挨打!

先上结论:在极限情况下,某一个位置链表长度达到11时,才会转换成红黑二叉树结构。 这个极限情况指的是每次都是因为某个位置链表长度而导致的数组扩容,比如说数据只向数组中一个位置添加数据。 网上很多人说jdk1.8后HashMap链表长度超过8就会转换成红黑树,通过源码阅读和测试后已经可以确定并不是超过8个就变红黑树,链表长度超过8,只是会尝试转换为二叉树,转换前,首先判断数组容量是否足够大,如果不够大,则进行扩容,发现长度小(未达到64),则扩容为原来的2倍,如果达到64,假设数组某个位置链表长度已经为10.

Together 3500

在Java 1.8中,HashMap的链表在什么条件下会转换为红黑树?

HashMap在jdk1.8之后引入了红黑树的概念,表示若桶中链表元素超过8时,会自动转化成红黑树;若桶中元素小于等于6时,树结构还原成链表形式。 原因: 红黑树的平均查找长度是log(n),长度为8,查找长度为log(8)=3,链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要;链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。 还有选择6和8的原因是: 中间有个差值7可以防止链表和树之间频繁的转换。假设一下,如果设计成

赵先森 8624

在Java8中为什么要使用红黑树来实现的HashMap?

一、前言 在jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度。 二、红黑树回顾 红黑树的英文是“Red-Black Tree",简称R-B Tree。它是一种不严格的平衡二叉查找树,我前面说了,它的定义是不严格符合平衡二叉查找树的定义的。那红黑树空间是怎么定义的呢? 顾名思义,红黑树中的节点,一类被标记为黑色,一类被标记...

清风追梦enjoy的专栏 1万+
下一篇: 使用FreeMarker导出带有背景色的excel
nacycher
博客等级 码龄8年 25粉丝 13原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值