Map集合、散列表、红黑树介绍

详解set/map的底层结构——AVL树和红黑树 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。AVL树的规则如下1.它的左右子树都是AVL树2.左右子树高度之差(这里我们简称为平衡因子)的绝对值不超过1如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在logN,搜索时间复杂度logN。 阅读详情

前言

声明,本文用得是jdk1.8

前面已经讲了Collection的总览和剖析List集合:

原本我是打算继续将Collection下的Set集合的,结果看了源码发现:Set集合实际上就是HashMap来构建的!

所以,就先介绍Map集合、散列表和红黑树吧!

看这篇文章之前最好是有点数据结构的基础:

当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~

一、Map介绍

1.1为什么需要Map

前面我们学习的Collection叫做集合,它可以快速查找现有的元素。

而Map在《Core Java》中称之为–>映射..

映射的模型图是这样的:

那为什么我们需要这种数据存储结构呢???举个例子

  • 作为学生来说,我们是根据学号来区分不同的学生。只要我们知道学号,就可以获取对应的学生信息。这就是Map映射的作用!

生活中还有很多这样的例子:只要你掏出身份证(key),那就可以证明是你自己(value)

1.2Map与Collection的区别

1.3Map的功能

下面我们来看看Map的源码:

简单常用的Map功能有这么一些:

下面用红色框框圈住的就是Map值得关注的子类:

二、散列表介绍

无论是Set还是Map,我们会发现都会有对应的–>**Hash**Set,**Hash**Map

首先我们也先得回顾一下数据和链表:

  • 链表和数组都可以按照人们的意愿来排列元素的次序,他们可以说是有序的(存储的顺序和取出的顺序是一致的)
  • 但同时,这会带来缺点:想要获取某个元素,就要访问所有的元素,直到找到为止。
  • 这会让我们消耗很多的时间在里边,遍历访问元素~

而还有另外的一些存储结构:不在意元素的顺序,能够快速的查找元素的数据

  • 其中就有一种非常常见的:散列表

2.1散列表工作原理

散列表为每个对象计算出一个整数,称为散列码。根据这些计算出来的整数(散列码)保存在对应的位置上!

在Java中,散列表用的是链表数组实现的,每个列表称之为桶。【之前也写过桶排序就这么简单,可以回顾回顾】

一个桶上可能会遇到被占用的情况(hashCode散列码相同,就存储在同一个位置上),这种情况是无法避免的,这种现象称之为:散列冲突

  • 此时需要用该对象与桶上的对象进行比较,看看该对象是否存在桶子上了~如果存在,就不添加了,如果不存在则添加到桶子上
  • 当然了,如果hashcode函数设计得足够好,桶的数目也足够,这种比较是很少的~
  • 在JDK1.8中,桶满时会从链表变成平衡二叉树

如果散列表太满,是需要对散列表再散列,创建一个桶数更多的散列表,并将原有的元素插入到新表中,丢弃原来的表~

  • 装填因子(load factor)决定了何时对散列表再散列~
  • 装填因子默认为0.75,如果表中超过了75%的位置已经填入了元素,那么这个表就会用双倍的桶数自动进行再散列

当然了, 在后面阅读源码的时候会继续说明的,现在简单了解一下即可~

扩展阅读:

三、红黑树介绍

上面散列表中已经提过了:如果桶数满的时候,JDK8是将链表转成红黑树的~。并且,我们的TreeSet、TreeMap底层都是红黑树来实现的。

所以,在这里学习一波红黑树到底是啥玩意。

之前涉及过二叉树的文章:

在未学习之前,我们可能是听过红黑树这么一个数据结构类型的,还有其他什么B/B+树等等,反正是比较复杂的数据结构了~~~

各种常见的树的用途:

来源:
https://www.zhihu.com/question/30527705/answer/52527887

3.1回顾二叉查找树

首先我们来回顾一下:利用二叉查找树的特性,我们一般来说可以很快地查找出对应的元素。

可是二叉查找树也有个例(最坏)的情况(线性):

上面符合二叉树的特性,但是它是线性的,完全没树的用处~

树是要“均衡”才能将它的优点展示出来的~,比如下面这种:

因此,就有了平衡树这么一个概念~红黑树就是一种平衡树,它可以保证二叉树基本符合矮矮胖胖(均衡)的结构

3.2知新2-3树

讲到了平衡树就不得不说最基础的2-3树,2-3树长的是这个样子:

在二叉查找树上,我们插入节点的过程是这样的:小于节点值往右继续与左子节点比,大于则继续与右子节点比,直到某节点左或右子节点为空,把值插入进去。这样无法避免偏向问题

而2-3树不一样:它插入的时候可以保持树的平衡!

在2-3树插入的时可以简单总结为两个操作:

  • 合并2-节点为3-节点,扩充将3-节点扩充为一个4-节点
  • 分解4-节点为3-节点,节点3-节点为2-节点
  • ……..至使得树平衡~

合并分解的操作还是比较复杂的,要分好几种情况,代码量很大~这里我就不介绍了,因为要学起来是一大堆的,很麻烦~

3.3从2-3树到红黑树

由于2-3树为了保持平衡性,在维护的时候是需要大量的节点交换的!这些变换在实际代码中是很复杂的,大佬们在2-3树的理论基础上发明了红黑树(2-3-4树也是同样的道理,只是2-3树是最简单的一种情况,所以我就不说2-3-4树了)。

  • 红黑树是对2-3查找树的改进,它能用一种统一的方式完成所有变换。

红黑树是一种平衡二叉树,因此它没有3-节点。那红黑树是怎么将3-节点来改进成全都是二叉树呢?

红黑树就字面上的意思,有红色的节点,有黑色的节点:

我们可以将红色节点的左链接画平看看:

一颗典型的二叉树:

将红色节点的左链接画平之后:得到2-3平衡树:

3.4红黑树基础知识

前面已经说了,红黑树是在2-3的基础上实现的一种树,它能够用统一的方式完成所有变换。很好理解:红黑树也是平衡树的一种,在插入元素的时候它也得保持树的平衡,那红黑树是以什么的方式来保持树的平衡的呢?

红黑树用的是也是两种方式来替代2-3树不断的节点交换操作:

  • 旋转:顺时针旋转和逆时针旋转
  • 反色:交换红黑的颜色
  • 这个两个实现比2-3树交换的节点(合并,分解)要方便一些

红黑树为了保持平衡,还有制定一些约束,遵守这些约束的才能叫做红黑树:

  1. 红黑树是二叉搜索树。
  2. 根节点是黑色。
  3. 每个叶子节点都是黑色的空节点(NIL节点)。
  4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点(每一条树链上的黑色节点数量(称之为“黑高”)必须相等)。

3.5红黑树总结

红黑树可以说是十分复杂的,我在学习的时候并没有去认真细看当中的处理细节,只是大概的过了一遍,知道了整体~

有了前辈很多优质的资料,相信要等到想要理解其中的细节,花点力气和时间还是可以掌握一二的。

红黑树参考资料:

四、总结

这篇主要介绍了Map集合的基础知识,了解Map的常用子类~

简单介绍了散列表和红黑树,他俩作为Hashxxx和Treexxx的底层,了解其整体思想和相关基础在后续看源码也不至于那么懵~

后续会去看Map常用子类的源码,文章敬请期待~~~~

文章的目录导航:https://zhongfucheng.bitcron.com/post/shou-ji/gong-zhong-hao-wen-zhang-zheng-li

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y。为了大家方便,刚新建了一下qq群:742919422,大家也可以去交流交流。谢谢支持了!希望能多介绍给其他有需要的朋友

参考资料:

  • 《Core Java》
一文带你速通HashMap底层核心数据结构红黑树 每个节点或者红色,或者是黑色。根节点为黑色。每一个叶子节点都是黑色。如果一个节点是红色,那么他的孩子节点都是黑色。从任意一个节点,经过的黑色节点是一样的。在《算法4》一书中认为红黑树和2-3树是等价的。 阅读详情

相关推荐

华为云Stack 8.X 流量模型分析(一)

​ 当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。​ 内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

Ciyaso的博客 3244

HashMap底层红黑树原理(超详细图解)+手写红黑树代码

在看完了小刘老师和黑马的源码视频之后,我整理了一篇HashMap的底层源码文章,学海无涯,这几天看了对红黑树的讲解,故将其整理出来 HashMap底层源码解析上 HashMap底层源码解析下 视频链接 小刘老师讲源码 传智播客-黑马程序员 文章目录红黑树什么是树 红黑树 什么是树 树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合,它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。把它叫做“树”是因为他看起来像一颗倒挂的树,也就是说它是根朝上,而叶向

wenwenaier的博客 2万+

unity打包流程整理-Windows/Mac/Linux平台

1.Platform(平台)功能: 选择目标构建的目标平台选项PC, Mac & Linux Standalone: 适用于 Windows、Mac 和 Linux 平台2.Target Platform(目标平台)功能: 选择具体的操作系统版本选项Windows: 针对 Windows 操作系统Mac: 针对 macOS 操作系统Linux: 针对 Linux 操作系统3.Architecture(架构)功能: 选择应用程序的目标处理器架构选项x86: 针对 32 位系统。

weixin_42333247的博客 5136

【数据结构】认识红黑树 --map/set的底层原理

**红黑树**也叫RB树(Red-Black Tree),实际就是一种二叉搜索树,只是它的节点不是通过平衡因子来控制树的形状,而是为节点设置了两种颜色来控制,使得树中**最长路径中节点个数不会超过最短路径节点个数的两倍**,这样就能保证树触发旋转的几率大大减小。因此红黑树在每个节点上增加了一个一个的存储位表示节点的颜色,可以是Red或Black。

ly_6699的博客 2608

嘉立创EDA实战:4层板叠层设计避坑指南(附阻抗计算技巧)

本文详细解析了嘉立创EDA在4层PCB叠层设计中的实战技巧与避坑指南,涵盖经典叠层方案对比、介质厚度选择、电源系统设计及高速信号完整性优化。特别介绍了阻抗计算工具的应用,帮助工程师在高速电路设计中实现性能与成本的最佳平衡。

sea99的博客 966

OpenGL计算着色器工作组设置测试

先看看不同的显卡上工作组的数量情况。 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, data); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, data + 1); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, data...

qq_26328385的博客 1484

map和set(三)——红黑树

enum(枚举)里存的是节点的颜色节点要有指向左节点、右节点、父节点的指针;节点存的值(数据)及节点的颜色RED,BLACK, _kv(kv){}初始化(构造)节点,三指针指向空;_kv(值or数据)取决于传的值,_col默认为红色为什么(插入)节点的颜色默认为红色呢?如果插入黑色节点就会破坏规则:每条路径上黑色节点的数量相同所以(插入)节点的默认颜色为红色2.2插入以下为简写:u uncle 叔叔p parent 父亲g grandfather 爷爷。

m0_74515566的博客 1057

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)

终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴).........

博客而已 1万+

Java中的Map集合、散列表、红黑树介绍

​前言 本文源码采用jdk1.8 上面两篇介绍了Collection下的list,不接着介绍Collection下的set,因为Set集合实际上就是HashMap来构建的!前面讲解了: 湿兄红着眼熬夜肝了篇集合ArrayList(附源码分析) 湿兄这一篇LinkedList也是红着眼(附源码分析) Java集合是Java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*,Java集合主要可以划分为4个部分:List列表、Set集合、

597

C#与倍福TwinCAT3通信实战:ADS协议封装与设备变量读写完整源码

倍福(Beckhoff)TwinCAT3 作为工业自动化领域主流的软PLC系统,其内置的ADS(Automation Device Specification)协议是实现上位机与TwinCAT3通信的核心标准。传统ADS通信开发存在门槛高(协议细节复杂)、稳定性差(缺乏统一异常处理)、复用性低(重复编码)等问题。本文基于 C# 技术栈,聚焦“协议封装标准化、变量读写易用化、通信稳定工业化”核心需求,提供一套完整的 ADS 协议封装方案与设备变量读写源码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1987

[PCIE5.0] 2.2.8.9 Optimized Buffer Flush/Fill (OBFF) Message

这段文字讲解的是 优化的缓冲区清空/填充(OBFF)消息,它是 PCI Express(PCIe)规范中的一个可选功能,用于向设备报告平台中央资源的状态。简单来说,OBFF 主要帮助设备了解当前平台资源(如缓存或内存)的状态,从而优化数据的处理和传输。这章重点内容如下。

系统固件工程师 538

集合Collection--Map集合、散列表、红黑树介绍

一、Map介绍 1.1为什么需要Map 前面我们学习的Collection叫做集合,它可以快速查找现有的元素。 而Map在《Core Java》中称之为-->映射.. 映射的模型图是这样的:   那为什么我们需要这种数据存储结构呢???举个例子 作为学生来说,我们是根据学号来区分不同的学生。只要我们知道学号,就可以获取对应的学生信息。这就是Map映射的作用! 生活中...

a1405的专栏 226

R语言使用survminer包的ggcompetingrisks函数可视化竞争风险的累积事件曲线、使用可视化对象的mapping属性自定义修改、配置颜色分组及线条类型

R语言使用survminer包的ggcompetingrisks函数可视化竞争风险的累积事件曲线、使用可视化对象的mapping属性自定义修改、配置颜色分组及线条类型

data+scenario+science+insight 1380

JAVA基础:Map集合、散列表、红黑树介绍

1.Map介绍 Map–>映射 key获取value 1.1方法 V put(K key,V value):添加元素,如果当前key对应有value值,则替换掉并返回旧value值 void clear():移除所有键值对元素 V remove(Object key):根据key值删除键值对,返回value值 boolean containsKey(Object key):判断集合是否含...

GvG的博客 487

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

哈希表和有序表的简单介绍

哈希表的简单介绍 哈希表是一种集合结构 包含map和set 如果只有key,没有伴随数据value,可以使用HashSet结构(C++ stl set) 如果拥有key,拥有伴随数据value,可以使用HashMap结构(C++ stl map) 有无伴随数据是Hashmap和Hashset的唯一区别,底层的实际结构都是一回事,都是使用的红黑树 ...

CHYabc123456hh的博客 343

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Map集合与Set集合

【前言】Map集合与Set集合都是专门用来进行搜索的容器或者数据结构(尤其适合动态查找,什么是动态查找呢,就是可能在查找时进行插入、删除的操作,如生活中的根据姓名查找考试成绩) 一、Map集合 1.官方文档: 首先值得注意的就是,Map并没有继承自Collection接口,而是独立的一块数据结构; Map是一个接口类,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复; Map接口下有两个普通子类,HashMap和TreeMap,其中,HashMap就是我们通常所

敲敲敲 1133

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

集合Map,List,set

Java集合大致可分为4种:Set(无序不可重复),List(有序可重复),Map(映射关系)。 集合只能保存对象,不能保存基本数据类型,虽然集合不能存放基本数据类型,但是它支持自动装箱。 Java集合主要由两个接口派生:Collection和Map。它们是Java集合框架的根接口。 Collection接口的子接口有:List,Set,Queue。 /* * Set是无序切不可...

黎子爱发呆博客 155

红黑树、HashSet集合、Map集合、HashMap集合、TreeMap集合

红黑树、HashSet集合、Map集合、HashMap集合、TreeMap集合

Achao_myFriend的博客 740

数据结构(Java):Map集合&Set集合&哈希表

Map&Set&哈希表

2401_83595513的博客 1968

JavaSE(6)——Map集合

Map集合 1. Map介绍 1.1 为什么需要Map Set集合是为了存储对象,快速查找而产生的,类似对象数组。而Map不同,Map的结构在官方的解释中被称为——“映射”。 映射的模型是一个Key对应一个Value,用Key来区别不同的Value。 比如,作为学生来说,根据学号可以区分不同的学生,只要知道学号,就可以获取对应的学生信息。比如身份证,通过身份证(key)就可以证明自己(value)。 1.2 Map与Collection的区别 Map集合的特点:将键映射到值的对象,一个映射不能包含重复的键,

phg739436146的博客 182
上一篇: List集合就这么简单【源码剖析】
下一篇: HashMap就是这么简单【源码剖析】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值