为什么HashMap使用红黑树而不使用AVL树

2023-11-18

在Jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度。

那么很多人就有疑问为什么是使用红黑树而不是AVL树,AVL树是完全平衡二叉树阿?

最主要的一点是:

在CurrentHashMap中是加锁了的,实际上是读写锁,如果写冲突就会等待,如果插入时间过长必然等待时间更长,而红黑树相对AVL树他的插入更快!

问题:为什么不使用AVL树而使用红黑树?

红黑树和AVL树都是最常用的平衡二叉搜索树,它们的查找、删除、修改都是O(lgn) time

AVL树和红黑树有几点比较和区别:

  1. AVL树是更加严格的平衡,因此可以提供更快的查找速度,一般读取查找密集型任务,适用AVL树。
  2. 红黑树更适合于插入修改密集型任务。
  3. 通常,AVL树的旋转比红黑树的旋转更加难以平衡和调试。

总结

  1. AVL以及红黑树是高度平衡的树数据结构。它们非常相似,真正的区别在于在任何添加/删除操作时完成的旋转操作次数。
  2. 两种实现都缩放为a O(lg N),其中N是叶子的数量,但实际上AVL树在查找密集型任务上更快:利用更好的平衡,树遍历平均更短。另一方面,插入和删除方面,AVL树速度较慢:需要更高的旋转次数才能在修改时正确地重新平衡数据结构。
  3. 在AVL树中,从根到任何叶子的最短路径和最长路径之间的差异最多为1。在红黑树中,差异可以是2倍。
  4. 两个都给O(log n)查找,但平衡AVL树可能需要O(log n)旋转,而红黑树将需要最多两次旋转使其达到平衡(尽管可能需要检查O(log n)节点以确定旋转的位置)。旋转本身是O(1)操作,因为你只是移动指针。

 

往期精彩内容:

Java知识体系总结(2021版)

超详细的springBoot学习笔记

Java多线程基础知识总结(绝对经典)

Java面试题总结(附答案)

Vue基础知识总结(绝对经典)

常见数据结构与算法整理总结

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

为什么HashMap使用红黑树而不使用AVL树 的相关文章

  • Android动态权限申请框架

    XmPermissions 项目介绍 Android动态权限申请框架 Github地址 https github com lhm0603 XmPermissionsProject 使用说明 XmPermissions 支持 Android
  • Java 代码块学习笔记(基础)

    目录 代码块 阉割的方法 只剩下方法体 1 普通代码块 定义在方法体内且无修饰符的代码块 2 静态代码块 定义在方法体外 类里面且须用 static 修饰的代码块 3 构造代码块 定义在方法体外 类里面但不用修饰的代码块 4 同步代码块 r
  • 基本数据类型对象包装类

    基本数据类型对象包装类 为了方便操作基本数据类型值 将其封装成了对象 在对象中定义了属性和行为丰富了该数据的操作 用于描述该对象的类就称为基本数据类型包装类 byte Byte short Short int Integer long Lo
  • IO流(一)

    IO概述 什么是IO java中I O的操作主要是靠java io包下的类和接口来实现的 IO分类 根据数据的流向 输入流和输出流 输入流 把数据从其他设备上读取到内存当中的流 输出流 把数据从内存当中写入到其他设备上的流 根据数据的类型分
  • Spring Boot进阶:原理、实战与面试题分析

    在当下的互联网应用中 业务体系日益复杂 业务功能也在不断地变化 以典型的电商类应用为例 其背后的业务功能复杂度以及快速迭代要求的开发速度 与5年前的同类业务系统相比 面临着诸多新的挑战 这些挑战中核心的一点就是快速高效地实现系统功能 同时保
  • Java句柄与指针

    java中的句柄分为两种 对象句柄 jvm中对象访问句柄 一 对象句柄 句柄 一个唯一的整数 作为对象的身份id 区分不同的对象 和同类中的不同实例 程序可以通过句柄访问对象的部分信息 句柄不代表对象的内存地址 在Java中的任何东西都可以
  • Java jdk1.5 新特性讲解

    JDK1 5 可以说是java 最经典的一个版本了 在 jdk1 5 发布时 就因他的改动大 而命令为jdl5 0 为后来 java 的壮大立下了汗马之劳 有网友在面试的时候被问到 jdk新特性 我这里索性就从 jdk1 5的特性说到1 8
  • Java反射之Method的invoke方法实现

    使用reflect 反射 包下面的Field和Method类获得类的属性和方法 并对属性和方法进行操作 在框架中经常会会用到method invoke 方法 用来执行某个的对象的目标方法 以前写代码用到反射时 总是获取先获取Method 然
  • 语句执行顺序对判断语句条件的影响

    对比相同的输出结果下 不同的语句执行顺序对判断语句条件的影响 public class Homework1 public static void main String args 输出1 100偶数 每5个一行 一行中的每个数字之间使用逗号
  • websocket即时通讯

    目录 一 websocket简介 二 背景 三 优点 1 控制开销 2 实时性更强 3 保持连接状态 4 更好的二进制支持 5 支持扩展和更好的实现压缩效果 四 原理 1 客户端 服务器建立TCP连接 三次握手 2 TCP连接成功后 客户端
  • Windows批处理(cmd/bat)常用命令小结

    一 前言 批处理文件 batch file 包含一系列 DOS命令 通常用于自动执行重复性任务 用户只需双击批处理文件便可执行任务 而无需重复输入相同指令 编写批处理文件非常简单 但难点在于确保一切按顺序执行 编写严谨的批处理文件可以极大程
  • java基础知识点

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经700 订阅 CSDN最
  • Java异常机制Throwable

    Java中异常的概念以及处理异常 在Java程序运行期间出现了一个错误 这个错误可能是由于文件包含了错误信息 或者是由于网络连接出现问题 也可以是因为使用了无效的数组下标 或者是试图使用一个没有被赋值的对象引用而造成的 我们称这样的错误为异
  • Java的运算符

    目录 一 什么是运算符 二 算术运算符 1 基本四则运算符 加减乘除模 2 增量运算符 3 自增 自减运算符 三 关系运算符 四 逻辑运算符 重点 1 逻辑与 2 逻辑或 3 逻辑非 4 短路求值 五 位运算符 1 按位与 2 按位或 3
  • Java 三大特性学习笔记(基础)

    目录 约定俗成的运算符 铺垫 1 逻辑运算中的 和 和 一个符号 和两个符号 的区别是 2 位 bit 运算中的 和 第一个特性 封装性 封装修饰符介绍 以下封装等级由低写到高 1 public 公开等级 相当于没有封装 2 protect
  • String类

    String类 String 类的特点 字符串一旦初始化就不会被改变 1 获取 1 1 获取字符串中字符的个数 长度 int length 1 2 根据位置获取字符 char charAt int index 1 3 根据字符 串 获取在字
  • 【Java】运算符

    我不去想是否能够成功 既然选择了远方 便只顾风雨兼程 汪国真 目录 1 认识运算符 1 1 认识运算符 1 2 运算符的分类 2 算术运算符 2 1 四则运算符 2 2 复合赋值运算符 2 3 自增 自减 运算符 3 关系运算符 4 逻辑运
  • 缓冲流【Buffered】

    缓冲流 Buffered 缓冲流我们理解为原来的使用数组方式进行数据传输的一种增强 按照类型分为 字符缓冲流 BufferedReader BufferedWriter 字节缓冲流 BufferedInputStream BufferedO
  • List 集合 —— ArrayList

    ArrayList 简介 成员变量 构造方法 成员方法 增 删 其他 总结 参考 简介 ArrayList 是 Java 集合框架中比较常用的类 是用来存储数据的容器 可存储重复的元素 允许存储null值 底层基于数组实现容量大小动态变化
  • java必懂之"=="与equals的区别

    屁话不多说 直接上代码 equals和关系运算符 的区别 author 刘威辰的秘密花园 1 用在基本数据类型boolean a b 2 判断引用是否指向同一个地址且内容是否相同 equals 1 用于判断两个变量是否对同一个对象的引用 即

随机推荐

  • 多模态模型学习1——CLIP对比学习 语言-图像预训练模型

    多模态模型学习1 CLIP对比学习 语言 图像预训练模型 学习前言 什么是CLIP模型 代码下载 CLIP实现思路 一 网络结构介绍 1 Image Encoder a Patch Position Embedding b Transfor
  • SQL中with as 用法

    with temp1 as select from table limit 10 Select from temp1 也可以嵌套 with temp1 as select from table limit 10 temp2 as selec
  • js添加类名的两种方法

    1 通过className来添加 删除类名 添加类名 获取元素 className 类名1 类名2 多个类名用空格隔开 移除类名 获取元素名 className 直接等于一个空字符串即可删除类名 2 通过classList来添加 删除类名
  • GLES2.0中文API-glHint

    名称 glHint 指定特定于实现的提示 C规范 void glHint GLenum target GLenum mode 参数 target 指定一个符号常量 指示要控制的行为 接受GL GENERATE MIPMAP HINT mod
  • 线程安全的单例模式

    线程安全的单例模式 单例模式 属于创建类型的一种常用的软件设计模式 通过单例模式创建的类在当前进程中只有一个实例 一份资源只能被申请加载一次 如何实现 饿汉模式 资源在程序初始化的时候就去加载 后边使用的时候直接使用 使用会非常流畅 但是有
  • 霍布森选择效应(Hobson choice Effect)

    1631年 英国剑桥商人霍布森从事马匹生意 他说 你们买我的马 租我的马 随你的便 价格都便宜 霍布森的马圈大大的 马匹多多的 然而马圈只有一个小门 高头大马出不去 能出来的都是瘦马 赖马 小马 来买马的左挑右选 不是瘦的 就是赖的 霍布森
  • PHP定时任务脚本模板带日志记录

  • 超市商品信息管理系统/超市管理系统的设计与实现

    摘 要 随着现在网络的快速发展 网上管理系统也逐渐快速发展起来 网上管理模式很快融入到了许多国家的之中 随之就产生了 超市商品信息管理系统 这样就让超市商品信息管理系统更加方便简单 对于本超市商品信息管理系统的设计来说 系统开发主要是采用j
  • 【线性代数】第一章 1.3逆矩阵

    上一篇 1 2 高斯消元法与矩阵的初等变换 目录 一 逆矩阵的概念与性质 二 用行初等变换求逆矩阵 一 逆矩阵的概念与性质 前面我们定义了矩阵的加法 减法和乘法三种运算 自然的 欲在矩阵中引入类似于除法的概念 其关键在于引入类似于倒数的概念
  • STM32入门之GPIO详解

    一 GPIO基础知识 大家在做单片机相关项目开发时候 相信大家拿到板子的第一件事就是点亮开发板上的LED指示灯 也就是说我们第一件事就是对单片机的IO口进行操作 不管是51单片机还是32单片机亦或是arduino 我们想要控制一个最基本的外
  • Markdown编辑器【写作技巧】

    CSDN的MD编辑器 写作技巧 0 Markdown的公式编辑技巧 单个公式用 begin equation 多行公式 begin align 或者 begin array 1 在线LaTeX公式的编辑器 2 继续补充 color Oran
  • 【转】OCaml基础知识

    出自 http www nirvanastudio org ocaml the basics of ocaml html 注释 OCaml的注释是用 and 来分隔的 如下 这是一个单行注释 这是一个 多行 注释 换句话说 注释的方式和原始
  • 求最大公约数的快速算法

    stein 算法求最大公约数 和欧基里德算法相比 效果更好 主要思想如下 化归思想 1 m为奇数时 1 n也为奇数 gcd m n gcd m n 2 m n 2 2 n为偶数 gcd m n gcd m n 2 2 m为偶数时 1 n也为
  • 【Python】批量修改图片文件名和xml文件信息

    在使用tensorflow进行数据训练时 由于原图片文件名较繁琐 且由于根据原图片名生成的xml标签文件中生成了包含filename的标签属性 不利于后期测试训练效果 故通过Python代码对图片名和xml文件信息进行批量修改为由0开始的顺
  • std::thread使用

    C 11新特性 http www cnblogs com pzhfei archive 2013 03 02 CPP new feature html section 7 1 C 11新特性学习笔记 http blog csdn net h
  • java path环境变量_Windows下PATH等环境变量详解

    在学习JAVA的过程中 涉及到多个环境变量 environment variable 的概念 如PATH 正确地配置这些环境变量 是能够顺利学习 开发的前提 而经常出现的问题是 有的学习者能够按照提示一步一步地正确配置 但时间一长就忘了 出
  • HTML对字体的操作详解

    摘自 HTML对字体的所有操作详解 经典 作者 HeroKern 发布时间 2016 01 31 21 15 31 网址 https blog csdn net qq 21792169 article details 50615919 ut
  • shell脚本二:条件语句和多路分支语句

    1 条件语句 bin bash if ne 1 then echo usage 0 filename exit fi if e 1 then echo 1 not exist exit fi if d 1 then echo 1 is a
  • 服务器备案新增网站,已经备案服务器 增加新域名

    已经备案服务器 增加新域名 内容精选 换一换 网站的访问与域名的状态 域名实名认证状态 网站备案状态 解析是否生效 网站网络环境等多个环节有关系 在这些环节中 任意一个环节出现问题 都会导致网站无法访问 查询域名注册信息 检查域名是否过期
  • 为什么HashMap使用红黑树而不使用AVL树

    在Jdk1 8版本后 Java对HashMap做了改进 在链表长度大于8的时候 将后面的数据存在红黑树中 以加快检索速度 那么很多人就有疑问为什么是使用红黑树而不是AVL树 AVL树是完全平衡二叉树阿 最主要的一点是 在CurrentHas