hashmap为什么8转成红黑树_深入分析HashMap的红黑树实现方式

2023-11-13

在分析jdk1.8的HashMap实现原理之前,咱们先可以了解一下红黑树的设计,相比jdk1.7的HashMap而言,jdk1.8最重要的就是引入了红黑树的设计,当冲突的链表长度超过8个的时候,链表结构就会转为红黑树结构。

01、故事的起因

JDK1.8最重要的就是引入了红黑树的设计(当冲突的链表长度超过8个的时候),为什么要这样设计呢?好处就是避免在最极端的情况下冲突链表变得很长很长,在查询的时候,效率会非常慢。
  • 红黑树查询:其访问性能近似于折半查找,时间复杂度O(logn);
  • 链表查询:这种情况下,需要遍历全部元素才行,时间复杂度O(n);

本文主要是讲解红黑树的实现,只有充分理解了红黑树,对于后面的分析才会更加顺利。

简单的说,红黑树是一种近似平衡的二叉查找树,其主要的优点就是“平衡“,即左右子树高度几乎一致,以此来防止树退化为链表,通过这种方式来保障查找的时间复杂度为log(n)。

关于红黑树的内容,网上给出的内容非常多,主要有以下几个特性:

  • 1、每个节点要么是红色,要么是黑色,但根节点永远是黑色的;
  • 2、每个红色节点的两个子节点一定都是黑色;
  • 3、红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色);
  • 4、从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点;
  • 5、所有的叶节点都是是黑色的(注意这里说叶子节点其实是上图中的 NIL 节点);

在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件3或条件4,需要通过调整使得查找树重新满足红黑树的条件。

02、调整方式

上面已经说到当树的结构发生改变时,红黑树的条件可能被破坏,需要通过调整使得查找树重新满足红黑树的条件。

调整可以分为两类:一类是颜色调整,即改变某个节点的颜色,这种比较简单,直接将节点颜色进行转换即可;另一类是结构调整,改变检索树的结构关系。结构调整主要包含两个基本操作:左旋(Rotate Left)右旋(RotateRight)

2.1、左旋

左旋的过程是将p的右子树绕p逆时针旋转,使得p的右子树成为p的父亲,同时修改相关节点的引用,使左子树的深度加1,右子树的深度减1,通过这种做法来调整树的稳定性。过程如下:

以jdk1.8为例,打开HashMap的源码部分,红黑树内部类TreeNode属性分析:

左旋方法rotateLeft如下:

2.2、右旋

了解了左旋转之后,相应的就会有右旋,逻辑基本也是一样,只是方向变了。右旋的过程是将p的左子树绕p顺时针旋转,使得p的左子树成为p的父亲,同时修改相关节点的引用,使右子树的深度加1,左子树的深度减1,通过这种做法来调整树的稳定性。实现过程如下:

同样的,右旋方法rotateRight如下:

03、操作示例介绍

3.1、插入调整过程图解

3.2、删除调整过程图解

3.3、查询过程图解

04、总结

至此,红黑树的实现就基本完成了,关于红黑树的结构,有很多种情况,情况也比较复杂,但是整体调整流程,基本都是先调整结构然后调整颜色,直到最后满足红黑树特性要求为止。如果有理解不当之处,欢迎指正!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hashmap为什么8转成红黑树_深入分析HashMap的红黑树实现方式 的相关文章

  • python anaconda安装与使用

    安装 anaconda 下载 Anaconda Anaconda Distribution 打开 Anaconda Prompt 控制台 创建一个管理环境 conda create n pytorch python 3 6 conda 是指
  • NOIP2011提高组 DAY2 题解&总结

    考试时的心态 这次离线赛考的是NOIP2011 考得比较差 其实试卷比较水 水出新高度了 但是就考了160分 还是因为大意了 说实话 我一直在想第二题那个Sigma 是怎么计算的 很虚 虽然最后证明我的想法是正确的 但是由于这道题花的时间太
  • 自媒体短视频应该如何做选题?写好视频脚本?

    在这个内容同质化严重的环境下 选题成了业内人士最头疼的问题 这里分享几个常用的几个方法 1 逆向 这个方法主要是针对同质化的选题 如果一个选题 大家都在正向输出 那么我们可以逆向输出 比如 一块废铁是怎么制作成一把菜刀的 和 一把高颜值的菜
  • node request 解决请求时 有时候 content-length 获取不到

    今天使用了 request 模块的时候 想获取每次请求的大小 以方便判断下载进度 网速等等 然后 content length 头总是获取不到 下面给出解决方法 request 模块的使用方法见 api 文档 https github co
  • 链游玩家周报(6.6-6.12)

    导语 上周链游玩家平台动态总览 魔域传说 6 9上线链游玩家平台 NFT艺术品成交价创下历史记录 魔域传说 6 9上线链游玩家平台 魔域正版授权 由 魔域 原班团队打造 全新魔域正版游戏 魔域传说 震撼来袭 继承魔域IP世界观 还原经典玩法
  • 第十一届“泰迪杯” 数据挖掘挑战赛 火热报名中!

    距离第十一届 泰迪杯 数据挖掘挑战赛报名结束仅剩下两周时间 为能让各位参赛小伙伴对 泰迪杯 竞赛进一步了解 今天小编为大家整理了详细的竞赛介绍 想要了解竞赛的小伙伴 快跟紧我的步伐吧 泰迪杯竞赛介绍 泰迪杯 数据挖掘挑战赛由泰迪杯数据挖掘挑
  • Unity3D:摄像头主角视角追踪

    摄像机的平滑追踪对于游戏来说十分实用 是游戏交互中必不可少的一部分 在一些竞速游戏中视角往往需要大幅度变动 效果 新浪上传又挂了 FollowTarget cs 挂到摄像机上即可 using UnityEngine using System
  • [网鼎杯 2018]Comment(二次注入,git泄露,git恢复)

    进入题目是这样的 要发帖还必须登录 在这里已经给了你用户名并提示了密码 密码隐藏了后三位 我们可以用爆破爆破后面三位的方法 由爆破状态码的密码后三位为666 登录进去就可以发帖了 接下来用dirsearch扫描 发现存在 git文件 那应该
  • 人工智能的缺陷

    首先从应用层面理解什么是人工智能 目前人工智能主流应用面包括 自然语言处理领域 代表为chatgpt 我们能用其进行日常交流 问题答疑 论文书写等 计算机视觉领域 代表为人脸识别 现在广泛应用于进出小区 办公打卡 实名认证等 所以简单理解人
  • Ubuntu下配置DNS

    方法一 通过 etc network interfaces 在它的最后增加一句 多个dns之间用空格分隔 interfaces 5 file used by ifup 8 and ifdown 8 Include files from et
  • Jeecg-boot JDBC任意代码执行漏洞

    漏洞描述 JeecgBoot是一款开源的企业级低代码平台 提供了表单 视图 流程等一键生成代码功能 目前在GitHub具有 35 5k star 在V3版本中 由于未对JDBC连接字符串进行限制 未授权的攻击者可配置恶意的连接字符串 通过发
  • 【react】props的批量传递

    真实开发中 如果有很多个要传递的属性 并且属性值很有可能是通过后台接口拿到的 那么一个个的在标签上写属性就不行了 正确写法 此处 p 的 不是解构赋值的那个 而是react用来放置变量的 实际上真实的表达式只有 p 但是根据es6语法 对象
  • 解读awr报告

    第一次看到awr报告 里面包含很多东西 完全不知道从哪里看起也不知道各项指标都是什么含义 从头到尾看了一遍 啥也没有看到 看了后面忘了前面的 花费一天的时间去熟悉它 在网上查资料对着报告一项项的熟悉了一遍 DB Name DB Id Ins
  • Vim:如何退出Vim编辑器?

    Vim 如何退出Vim编辑器 笑 这个问题可以说是每个初学者的 必经之路咯 解决办法如下 想要退出vim时 先按Esc 然后直接输入 就会在最下面显示出一行 vim开始进入命令模式 而不是write模式 当初自己傻得不行 明知道命令却不知道
  • SQL Server 2012下载和安装配置详细教程手册

    SQL Server 2012 下载和安装详细教程 目录 SQL Server 2012 下载和安装详细教程 1 软件下载 2 软件安装 3 软件验证 1 软件下载 1 官网地址 https www microsoft com zh cn
  • 【LeectCode】刷题指南

    LeetCode刷题指南 算法 双指针 633 平方数之和 https leetcode cn com problems sum of square numbers 345 反转字符串中的元音字母 https leetcode cn com
  • 数字集成电路设计-18-UVM

    引言 UVM Universal Verification Methodology 可以理解为形而上的东西 可以理解为是基于System verilog的一个库 提供一些API调用 其实没必要把UVM抬的那么高 上升到形而上的层次 因为在实
  • 利用RDM速度投影法提取微多普勒时频图

    0 关于微多普勒 雷达发射电磁信号 EW 到物体并接受物体的回波信号 基于接收信号的延迟时间 雷达可以测量目标的距离 如果物体是移动的 接受信号的频率将偏离发射信号的频率 成为多普勒效应 多普勒频移取决于移动物体的径向速度 即在视线方向上的
  • 【Cubase11】音乐工作站:宿主软件 - 基础入门笔记

    笔记目录 一 虚拟声卡安装与设置 1 1 为什么要安装虚拟声卡 1 2 Voicemeeter官网下载 1 3 Voicemeeter安装运行 1 3 1 双击安装包 默认安装即可 1 3 2 设置电脑的声音输出设备为虚拟声卡输入 1 3

随机推荐

  • SQL 子查询和临时表格

    首个子查询解决方案 首先 我们需要按照日期和渠道分组 然后按事件数 第三列 排序 这样可以快速得出第一个问题的答案 SELECT DATE TRUNC day occurred at AS day channel COUNT as even
  • 华为OD机试真题 Java 实现【获取最大软件版本号】【2023Q1 100分】

    一 题目描述 Maven版本号定义 lt 主版本 gt lt 次版本 gt lt 增量版本 gt lt 里程碑版本 gt 举例3 1 4 beta 其中 主版本和次版本都是必须的 主版本 次版本 增量版本由多位数字组成 可能包含前导零 里程
  • 张一鸣

    转自 https baike baidu com item E5 BC A0 E4 B8 80 E9 B8 A3 15898544 fr aladdin 张一鸣出生于1983年福建龙岩 父亲在市科委的工作 后来去东莞开办电子产品加工厂 母亲
  • wangEditor富文本编辑器(第三章:图片上传)

    目录 前言 一 思路 1 修改上传方式 二 全部流程 总结 前言 接上一章字数限制做好后 这一章要解决一下图片上传得问题 官方中得图片是转成了base格式 但是现实情况下就是要调用后端接口上传照片 所以我们这章主要是修改图片上传得默认接口
  • bigdecimal去除末尾多余的0 ,stripTrailingZeros()科学计数法解决

    BigDecimal是处理高精度的浮点数运算的常用的一个类 当需要将BigDecimal中保存的浮点数值打印出来 特别是在页面上显示的时候 就有可能遇到预想之外的科学技术法表示的问题 一般直接使用 BigDecimal toString 方
  • 若依框架如何开启注册功能?

    如何开启注册功能 一 后端需要的修改 根据路径找到controller 发现配置通过service获得 找到对应的sysConfigMapper xml文件 找到数据库中表的数据 修改为true 后端需要改的就好了 二 前端需要的修改 将l
  • UVA 1601 The Morning after Halloween [DBFS]

    The Morning after Halloween Time Limit 12000MS 64bit IO Format lld llu 直接搜索时间过不了 可以先把底图抽出来 这样的话就不用O maxn maxn 5 来判断是否可以转
  • qemu模拟器搭建arm运行环境搭建笔记

    qemu system arm M vexpress a9 m 512M kernel home lyk Downloads qemu linux 3 16 arch arm boot zImage nographic append roo
  • SD2.0软件大会纪实 - 个人观感

    12月9日 10日 SD2 0大会在上海光大会展中心国际大酒店举行 有幸参加这场盛会 将这两天的所得分享一下 以下文字是通过回忆并参考了CSDN网站的报道整理出来的 9日是全体大会 上午Keynote基本上是个广告的集合 CSDN给自己的各
  • 算法导论随笔(十五):线性规划与单纯形算法(上篇:基本概念)

    线性规划 Linear Programming 问题指的是在给定有限资源的前提下 最大化或最小化某个目标的问题 这里我将分上下两篇来谈谈线性规划和单纯形算法 前言 线性规划问题有很多例子 比如在算法导论随笔 六 贪心算法Greedy alg
  • MSRA实习记

    文章目录 前言 时间线 实习生集体 办公楼 工作环境 饮食 娱乐活动 薪酬待遇 住宿 总结 前言 我是哈工大2018级本科生 由于大三课程枯燥 选择到北京实习 偶然看到了诗昭姐的招聘启事 幸运地获得了她的认可 获得了人生第一份实习 加入了D
  • Excel分割字符串

    在数据处理中我们经常会遇到分割字符的情况 比如读取csv文件 Excel提供了可视化的字符串分割方法 1 按分隔符 分割字符串 2 选择用 逗号 分割 3 结果如图
  • 自动化运维---ansible常用模块之文件操作(file&blockinfile&lineinfile模块)

    自动化运维 ansible常用模块之文件操作 file blockinfile lineinfile模块 文章目录 自动化运维 ansible常用模块之文件操作 file blockinfile lineinfile模块 1 file模块
  • 7. QML类中对象树的创建和销毁顺序是这样的

    简述 有下面一段代码 通常会有需求在Component onCompleted信号之后做一些初始化操作 那这些组件初始化完成的顺序是怎样的 同时有创建完成的信号 也有对应销毁完成的信号 类似C 中的构造和析构函数 但我们这里叫信号处理程序
  • java三种分页查询的方式

    第一种 分页 需要查询出总数 第二种分页如果是以id为主键并且是递增的情况 第三种直接用do while进行分页查询 不需要查询总个数和最大最小值 mybatis plus分页 第四种分页 for循环分页
  • Vue指令学习

    目录 v text 设置标签的内容 v html 设置元素的innerHTML v on 为元素绑定事件 v show 根据布尔值控制元素的样式为显示或隐藏 v if 根据布尔值控制dom为显示或隐藏 v bind 在vue中为元素绑定属性
  • SQLite 如何在Windows下编译?

    SQLite 如何在Windows下编译 发表时间 2007 6 13 12 44 00 评论 打印 字体 大 中 小 本文链接 http blog pfan cn lounger 26745 html 复制链接 分享到 0 标签 C C
  • 计算机中¥符号按哪个键,电脑键盘符号快捷键大全 电脑键盘上每个键的作用?...

    电脑键盘符号快捷键大全 电脑键盘符号怎么打 很多朋友还不太清楚电脑的各个符号要怎么打 快捷键是什么呢 那么下面就一起来看看电脑键盘符号大全吧 电脑键盘符号怎么打 电脑键盘符号大全 常见的标点符号 分号 书名号 双引号 单引号 破折号 竖线
  • sublime简用

    1 使用goto anything 快速查询各种文件 可以快速定位CSS中选择器 或JavaScript中的function 2 其中的输入时选取简化的输入则可 bgc就代表background color 3 多行游标 光标放在单词中 然
  • hashmap为什么8转成红黑树_深入分析HashMap的红黑树实现方式

    在分析jdk1 8的HashMap实现原理之前 咱们先可以了解一下红黑树的设计 相比jdk1 7的HashMap而言 jdk1 8最重要的就是引入了红黑树的设计 当冲突的链表长度超过8个的时候 链表结构就会转为红黑树结构 01 故事的起因