【Java 面试合集】HashMap中为什么要使用红黑树

news2024/11/28 18:43:55

HashMap中为什么要使用红黑树

1. 概述

从源码的结构方面讲述下为什么HashMap要使用红黑树。那没有红黑树的时候,底层是基于什么逻辑进行存储的。

2. 底层结构

如果忽略红黑树的话,HashMap底层的数据存储结构如下:

在这里插入图片描述

总体而言就是数组 + 链表的形式。我们可以通过hash函数来计算一个值,这个值就是数组中对应的下标。

所以HashMap的添加过程就是:

  • 通过hash函数计算一个值,通过这个值结合数组的长度,按位与计算出对应数组的位置
  • 如果此位置没有链表的话,直接添加节点为此链表的头节点
  • 如果此位置有链表的话,比较 hash以及key,如果hash以及key保持一致,说明是更新,然后直接更新。反之继续添加到链表的尾部

这样做的目的是,能通过hash函数快速的计算数组的下标,然后遍历链表来查询。但是 链表的的时间复杂度为O(n). 最起码要遍历一遍才能找到对应的值。为什么从JDK1.8之后 引入了红黑树 呢??? 听我慢慢分解。

3. 二叉搜索树

上述的截图中就是二叉搜索树的基本特征。如果想在二叉搜索树中来寻找一个节点,时间复杂度为O(logn)

如果将二叉搜索树的思想引入到HashMap呢??? 可以提高查询的效率,个人觉得这就是JDK1.8之后为什么引入红黑树的原理

4. 红黑树

红黑树

为什么是红黑树呢,不是单纯的二叉搜索树呢???

首先我们要知道红黑树一定是一个二叉搜索树,但是如果只是二叉搜索树的话,有可能出现下面的问题:

在这里插入图片描述

所有的节点有可能都会在一个方向。如果是这种结构的话,其实跟链表没啥区别。 所以引入了红黑树
红黑树的目的:为了让二叉树搜索树 相对平衡, 这样做可以尽最大的可能性提高查询/ 插入效率

5. 实现

在HashMap的源码中是去除链表直接使用二叉树吗??? no no no,并不是的。

下面的代码是HashMap源码中的一部分,可以看到代码中会对节点进行判断,如果是存在的节点个数 >= 7的话,才会开始转换二叉树,之前还是一直保持链表的形式。

// 一直循环添加节点
for (int binCount = 0; ; ++binCount) {
    // 循环 到链表的下一个节点为null的情况
    if ((e = p.next) == null) {
        // 给链表的尾部 构建新的节点
        p.next = newNode(hash, key, value, null);
        // 如果节点个数 >= 7. 添加到第八个节点
        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
            // 此方法将链表转化为红黑树
            treeifyBin(tab, hash);
        break;
    }
    if (e.hash == hash &&
        ((k = e.key) == key || (key != null && key.equals(k))))
        break;
    p = e;
}

本次的面试合集分享到此结束,欢迎看到的同学可以积极参加讨论,如果不对的,请即使指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vscode使用

我是四五年的webstorm忠粉,一直觉得它是世界上最好用、强大、方便的编辑器。 为了它深谙各种破解方法,突然有一天我知道的几种方法都不奏效了。破解的实在太累了,算了,尝试尝试不同的工具吧。 含泪挥别webstrom,捏着…

JDBC编程复习

文章目录JDBC1.概念2.原理3. 如何使用JDBC编程1. 下载mysql的jdbc驱动2. 项目中引入驱动4. JDBC使用1. 和数据库建立连接2.获取连接3. Statement对象4. 释放资源JDBC 1.概念 JDBC,即Java Database Connectivity,java数据库连接。是Java提供的API用来执行SQL语句&a…

SWPU新生赛WriteUp

一个线上赛,这个NSSCTF最爽的就是没有靶机操作的一分钟冷却,10.11比赛结束,但是我还要看看工控,所以不打这个比赛了,先把wp写了,pwn入门真TM艰难 WEB 前面送分题,中间的也是基础题,…

SQL概述及数据定义

文章目录一、SQL概述1.简介2.特点3.组成4.SQL分类5.书写规范二、数据定义1.模式的定义与删除①定义模式②删除模式2.基本表的定义、删除与修改①定义基本表②数据类型③模式与表④修改基本表⑤删除基本表3.索引的建立与删除①建立索引②删除索引一、SQL概述 1.简介 SQL (Stru…

使用IDA查看汇编代码上下文去辅助排查C++软件异常问题

目录 1、概述 2、汇编指令能最直接反映异常崩溃的原因 2.1、查看异常Code码及对应的异常类型 2.2、查看发生崩溃的那条汇编指令 3、阅读汇编代码上下文需要掌握一定的基础汇编知识 4、Windbg中显示的函数调用堆栈中的C代码行号,和最新的代码对不上了 5、Wind…

openGL学习之GLFW和GLAD的下载和编译

背景:为什么使用GLFW和GLADOPenGL环境 目前主流的桌面平台是GLFW和GLAD之前使用的GLUT和Free GLUT已经基本淘汰了,所以记录一下如何下载GLFW和GLAD并且编译.GLFW下载:An OpenGL library | GLFW复制到你想存放的位置,我这里就存放到C盘Libaray文件夹下了,这里是我存放…

算法训练营 day37 贪心算法 K次取反后最大化的数组和 加油站 分发糖果

算法训练营 day37 贪心算法 K次取反后最大化的数组和 加油站 分发糖果 K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标…

Eclipse 版本升级记录

前言 Eclipse 不是不能在线升级,至少没有找对方法,下面就让我来一步一步带你学会它、使用它吧! 一、概念 Eclipse主要分为两个概念,一个是在线升级 Eclipse 新版本,另一个是在线升级 Eclipse 插件,这两个是有很大区…

【记录】ChatGPT使用记录

文章目录2023年02月08日数学哲学Java其他2023年02月09日ChatGPT网络根据对话的日期、问题的类型进行整理 2023年02月08日 数学 感想:数学应该没啥问题,感觉只要自然语言没理解错了,剩下就不是事 积分 代数 哲学 哲学问题的回答就属于模棱…

JetpackCompose从入门到实战学习笔记7—Dialog的简单使用

JetpackCompose从入门到实战学习笔记7—Dialog的简单使用 1.Dialog对话框 Dialog的参数如下: Composable fun Dialog(onDismissRequest: (() -> Unit)?, //关闭对话框的回调properties: DialogProperties! DialogProperties(), //自定义对话框的属性content: ( Compose…

智能无障碍轮椅——汇总

文章目录一、设计内容二、控制理论三、材料列表四、控制图五、硬件介绍1、TB6612FNG电机驱动模块2、DX-BT04 2.0蓝牙模块3、MPU6050陀螺仪模块4、电源模块5、520编码器直流减速电机六、PID理论与算法控制七、代码解析八、参考博文一、设计内容 使用 STM32 作为主处理器进行开发…

Web3.0:互联网新阶段

Web3.0 定义:从后端生产关系革新开始。 Web3.0 是结合了去中心化和代币(Token)经济学等概念,基于区块链技术的全新的互联网迭代方向,意在解决 Web2.0 带来的生态不平衡、发展不透明等问题。与 AR/VR 等前端创新相比&am…

oracle外键约束、级联删除

根据约束名称查询:select * from user_constraints t where t.CONSTRAINT_NAME 约束名称举例:字段解析:1、CONSTRAINT_NAME:约束名称。2、CONSTRAINT_TYPE:约束类型。3、TABLE_NAME:约束所在的表。4、R_CO…

FreeModbus RTU 移植指南

FreeModbus 简介 FreeModbus 是一个免费的软件协议栈,实现了 Modbus 从机功能: 纯 C 语言支持 Modbus RTU/ASCII支持 Modbus TCP 本文介绍 Modbus RTU 移植。 移植环境: 裸机Keil MDK 编译器Cortex-M3 内核芯片(LPC1778/88&…

Intel x86_64 PMU简介

文章目录前言一、性能监控概述二、CPUID information三、架构性能监控3.1 架构性能监控 Version 13.1.1 架构性能监控 Version 1 Facilities3.1.2 预定义的体系结构性能事件3.1.3 cmask demo测试参考资料前言 Intel 64 和 IA-32 架构提供了 PMU(Performance Monito…

Oracle Data Guard Apply服务

1. Apply服务介绍 Apply服务自动应用redo到备数据库来保持与主数据库的同步和允许事务一致性访问数据。 缺省情况下,Apply服务等待备redo日志文件进行归档,然后再应用归档日志文件包含的redo。然而,可以启用实时Apply,允许当前的…

CentOS8基础篇2:文件系统

一、文件系统概述 1.文件系统的基本概念 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。它规定了文件的存储方式及文件索引方式等信息。文件系统主要由三部分组成,分别是与文件管理相关的软件、被管理的文件和实施文件管…

ip-guard如何查看客户端连接的服务器IP地址?

在客户端上通过“运行”输入win.ini打开文件(在目录C:\\Windows\\),可以从里面找到一个字段SIP,比如SIP=3232237616 再将其换算成16进制数为c0a80830

每天10个前端小知识 【Day 8】

前端面试基础知识题 1. Javascript中如何实现函数缓存?函数缓存有哪些应用场景? 函数缓存,就是将函数运算过的结果进行缓存。本质上就是用空间(缓存存储)换时间(计算过程), 常用于…

在CANoe/CANalyzer中给CAN Log.asc/blf文件“瘦身”

案例背景(共7页精讲): 该篇博文将告诉您,如何给离线文件CAN Log.asc/blf文件“瘦身”:批量删除/过滤 CAN Log中,不需要的CAN ID和CAN channel。 目录 1 准备工作 2 插入CAN Filter 3 保存“瘦身” 后的…