当前位置: 首页 > article >正文

Java高频面试之集合-10

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:详解红黑树?HashMap为什么不用二叉树/平衡树呢?


一、红黑树(Red-Black Tree)的核心特性

红黑树是一种 自平衡二叉搜索树,通过颜色标记和旋转规则确保树的高度平衡,从而保证操作效率。其核心规则如下:

  1. 节点颜色:每个节点为红色或黑色。
  2. 根节点:根必须是黑色。
  3. 叶子节点:所有叶子(NIL节点)均为黑色。
  4. 红色节点规则:红色节点的子节点必须为黑色(无连续红色节点)。
  5. 黑高一致:从任一节点到其所有叶子节点的路径包含相同数量的黑色节点(黑高相同)。

平衡性保障

  • 红黑树的最长路径不超过最短路径的2倍(通过规则4和5保证)。
  • 树的高度 h ≤ 2log(n+1),确保查找、插入、删除操作的时间复杂度为 O(log n)

二、红黑树的操作与调整
  1. 插入操作

    • 新节点初始为红色,插入后可能破坏红黑树规则。
    • 通过 旋转(左旋/右旋)颜色翻转 调整树结构。
    • 调整策略包括:
      • 叔节点为红色:颜色翻转(父、叔变黑,祖父变红)。
      • 叔节点为黑色且形成“三角”结构:旋转后调整颜色。
  2. 删除操作

    • 删除节点后可能破坏黑高平衡。
    • 通过旋转和颜色调整修复树结构,确保满足红黑树规则。

示例插入调整

插入前(父节点为红,叔节点为红):B/   \R     R/R(新节点)调整后(颜色翻转):R/   \B     B/R

三、HashMap为何选择红黑树而非二叉树/AVL树?
1. 普通二叉搜索树(BST)的问题
  • 退化风险:若数据有序插入(如递增序列),BST退化为链表,查找效率降至 O(n)
  • 不稳定性:无法保证动态操作后的平衡性,不适合高并发场景。
2. AVL树的局限性

AVL树是严格平衡的二叉搜索树(左右子树高度差 ≤1),但存在以下问题:

  • 维护成本高:插入/删除时需频繁旋转(平均旋转次数高于红黑树)。
  • 写性能差:对于频繁修改的场景(如HashMap的put/remove),AVL树的严格平衡导致性能下降。
3. 红黑树的优势
  • 平衡性与性能的折衷
    • 红黑树允许一定的“不平衡”(最长路径 ≤ 2倍最短路径),减少旋转次数。
    • 插入/删除的调整复杂度为 O(1)(仅颜色翻转)或 O(log n)(旋转),整体性能优于AVL树。
  • 更适合动态数据
    HashMap在哈希冲突时,链表可能频繁转换为树或退化,红黑树的动态调整效率更高。
4. HashMap的具体考量
  • 冲突处理场景
    • 当链表长度 ≥8 且桶数组容量 ≥64 时,链表转为红黑树。
    • 树节点数 ≤6 时退化为链表(避免小数据量下树的结构开销)。
  • 综合性能
    • 红黑树在查找(O(log n))与修改(较少旋转)间取得平衡,适合HashMap的读写混合负载。

四、性能对比:红黑树 vs AVL树 vs 链表
指标红黑树AVL树链表
查找速度O(log n)O(log n)(更快,因更平衡)O(n)
插入/删除O(log n)(旋转次数少)O(log n)(旋转次数多)O(1)(头尾操作)
平衡严格度宽松(最长路径 ≤2倍最短)严格(高度差 ≤1)无平衡
适用场景频繁修改的动态数据(如HashMap)静态数据或读多写少(如字典)数据量小或无序访问

五、红黑树在HashMap中的实现细节
  1. 树化条件

    • 链表长度 ≥8 且桶数组容量 ≥64(否则优先扩容)。
    • 退化为链表的阈值:树节点数 ≤6。
  2. 树节点结构

    static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {TreeNode<K,V> parent;  // 父节点TreeNode<K,V> left;    // 左子节点TreeNode<K,V> right;   // 右子节点TreeNode<K,V> prev;    // 前驱节点(用于快速退化为链表)boolean red;           // 颜色标记
    }
    
  3. 哈希分布优化

    • 通过 hashCode() 扰动函数减少哈希冲突。
    • 扩容时拆分树节点,保持红黑树结构或退化为链表。

🐮🐎

  • 红黑树:以适度的平衡性换取插入/删除的高效性,适合动态数据场景。
  • HashMap的选择:在哈希冲突严重时,红黑树提供比链表更高的查询效率,同时避免AVL树的写性能瓶颈。
  • 设计哲学:权衡空间、时间与实现复杂度,红黑树是HashMap在高冲突场景下的最优解。

在这里插入图片描述

相关文章:

Java高频面试之集合-10

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详解红黑树&#xff1f;HashMap为什么不用二叉树/平衡树呢&#xff1f; 一、红黑树&#xff08;Red-Black Tree&#xff…...

never_give_up

一个很有意思的题&#xff1a; never_give_up - Bugku CTF平台 注意到注释里面有1p.html&#xff0c;我们直接在源代码界面看&#xff0c;这样就不会跳转到它那个链接的&#xff1a; 然后解码可得&#xff1a; ";if(!$_GET[id]) {header(Location: hello.php?id1);exi…...

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…...

聊天室Python脚本——ChatGPT,好用

下面提供两个 Python 脚本&#xff0c;一个作为服务器端&#xff08;chat_server.py&#xff09;&#xff0c;一个作为客户端&#xff08;chat_client.py&#xff09;。你可以在一台电脑上运行服务器脚本&#xff0c;然后在不同电脑上运行客户端脚本&#xff08;连接时指定服务…...

AI4CODE】3 Trae 锤一个贪吃蛇的小游戏

【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 这次还是采用 HTML/CSS/JAVASCRIPT 技术栈 Trae 锤一个贪吃蛇的小游戏。 1 环境准备 创建一个 Snake 的子文件夹&#xff0c;清除以前的会话记录。 2 开始构建 2.1 输入会…...

【语料数据爬虫】Python爬虫|批量采集会议纪要数据(1)

前言 本文是该专栏的第2篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 在本文中,笔者将主要来介绍基于Python,来实现批量采集“会议纪要”数据。同时,本文也是采集“会议纪要”数据系列的第1篇。 采集相关数据的具体细节部分以及详细思路逻辑,笔…...

Linux 进程的一生(一):进程与线程的创建机制解析

在 Linux 操作系统中&#xff0c;每个任务都以「进程」的形式存在。但 Linux 下的「线程」又是什么&#xff1f;Linux 并没有单独定义一种全新数据结构来表示线程&#xff0c;而是将线程视为一种特殊的进程——一种共享资源的轻量级进程。然而&#xff0c;在具体实现和运行机制…...

【面试题集合】

目录 强缓存VS协商缓存**一、强缓存&#xff08;本地缓存&#xff09;**1. **定义**2. **核心 HTTP 头**3. **缓存生效流程**4. **应用场景** **二、协商缓存&#xff08;条件请求&#xff09;**1. **定义**2. **核心 HTTP 头**3. **缓存生效流程**4. **应用场景** **三、强缓存…...

【Academy】SSRF ------ Server-side request forgery

SSRF ------ Server-side request forgery 1. 什么是 SSRF&#xff1f;2. SSRF 攻击的影响是什么&#xff1f;3. 常见的 SSRF 攻击3.1 针对服务器的 SSRF 攻击3.2 针对其他后端系统的 SSRF 攻击 4. 规避常见的 SSRF 防御4.1 具有基于黑名单的输入过滤器的 SSRF4.2 具有基于白名…...

Git 的详细介绍及用法

一、Git 的优点 分布式版本控制 每个开发者都拥有完整的仓库副本&#xff0c;无需依赖中央服务器&#xff08;如 SVN&#xff09;。支持离线操作&#xff08;提交、查看历史、创建分支等&#xff09;。 高效的分支管理 创建和切换分支速度快&#xff08;几乎是瞬间完成&#x…...

Ubuntu22.04安装数据

数据库安装步骤&#xff1a; sudo apt-get update sudo apt install mysql-server mysql-client sudo systemctl start mysql sudo systemctl status mysql &#xff08;1&#xff09;在命令行登录 MySQL 数据库&#xff0c;并使用 mysql 数据库 &#xff08;必须使用这个…...

2025 ubuntu24系统宿主机上在线安装mysql数据库完整演示

说明&#xff1a;这是ubuntu24系统和安装后mysql的版本 rootmaster:/home/ubuntu# cat /etc/os-release PRETTY_NAME"Ubuntu 24.04.2 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04.2 LTS (Noble Numbat)" VERSION_CODENAMEnob…...

STM32之I2C硬件外设

注意&#xff1a;硬件I2C的引脚是固定的 SDA和SCL都是复用到外部引脚。 SDA发送时数据寄存器的数据在数据移位寄存器空闲的状态下进入数据移位寄存器&#xff0c;此时会置状态寄存器的TXE为1&#xff0c;表示发送寄存器为空&#xff0c;然后往数据控制寄存器中一位一位的移送数…...

windows版本的时序数据库TDengine安装以及可视化工具

了解时序数据库TDengine&#xff0c;可以点击官方文档进行详细查阅 安装步骤 首先找到自己需要下载的版本&#xff0c;这边我暂时只写windows版本的安装 首先我们需要点开官网&#xff0c;找到发布历史&#xff0c;目前TDengine的windows版本只更新到3.0.7.1&#xff0c;我们…...

【AI】单台10卡4090 openEuler服务器离线部署kasm workspace 提供简单的GPU云服务 虚拟化桌面

下载网址 Downloads | Kasm Workspaces 文件连接 wget https://kasm-static-content.s3.amazonaws.com/kasm_release_plugin_images_amd64_1.16.1.98d6fa.tar.gz wget https://kasm-static-content.s3.amazonaws.com/kasm_release_1.16.1.98d6fa.tar.gz wget https://kasm-st…...

NetAssist 5.0.14网络助手基础使用及自动应答使用方案

以下是NetAssist v5.0.14自动应答功能的详细使用步骤&#xff1a; 一、基础准备&#xff1a; 工具下载网址页面&#xff1a;https://www.cmsoft.cn/resource/102.html 下载安装好后&#xff0c;根据需要可以创建多个server&#xff0c;双击程序图标运行即可&#xff0c;下面…...

《深度解析DeepSeek-M8:量子经典融合,重塑计算能效格局》

在科技飞速发展的今天&#xff0c;量子计算与经典算法的融合成为了前沿领域的焦点。DeepSeek-M8的“量子神经网络混合架构”&#xff0c;宛如一把钥匙&#xff0c;开启了经典算法与量子计算协同推理的全新大门&#xff0c;为诸多复杂问题的解决提供了前所未有的思路。 量子计算…...

力扣1251年

正确写法&#xff1a; select p.product_id, ifnull(round(sum(units*price)/sum(units),2),0) average_price from prices p left join unitssold u on u.product_idp.product_id and u.purchase_date between start_date and end_date group by p.product_id; 错误写法&a…...

【写作模板】JosieBook的写作模板

文章目录 ⭐前言⭐一、设计模式怎样解决设计问题&#xff1f;&#x1f31f;1、寻找合适的对象✨(1)✨(2)✨(3) &#x1f31f;2、决定对象的粒度&#x1f31f;3、指定对象接口&#x1f31f;4、描述对象的实现&#x1f31f;5、运用复用机制&#x1f31f;6、关联运行时和编译时的结…...

47.HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 登录模块开发教程&#xff08;二&#xff09;&#xff1a;一键登录页面实现 文章目录 HarmonyOS NEXT 登录模块开发教程&#xff0…...

5.1 程序调试

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 本节中为了演示方便&#xff0c;使用的代码如下&#xff1a; 【例 5.1】【项目&#xff1a;code5-001】程序的调试。 static void Ma…...

Cursor初体验:excel转成CANoe的vsysvar文件

今天公司大佬先锋们给培训了cursor的使用&#xff0c;还给注册了官方账号&#xff01;跃跃欲试&#xff0c;但是测试任务好重&#xff0c;结合第三方工具开发也是没有头绪。 但巧的是&#xff0c;刚好下午有同事有个需求&#xff0c;想要把一个几千行的excel转成canoe的系统变…...

vue3-element-admin 前后端本地启动联调

一、后端环境准备 1.1、下载地址 gitee 下载地址 1.2、环境要求 JDK 17 1.3、项目启动 克隆项目 git clone https://gitee.com/youlaiorg/youlai-boot.git数据库初始化 执行 youlai_boot.sql 脚本完成数据库创建、表结构和基础数据的初始化。 修改配置 application-dev.y…...

emacs使用mongosh的方便工具发布

github项目地址: GitHub - csfreebird/emacs_mongosh: 在emacs中使用mongosh快速登录mongodb数据库 * 用途 在emacs中使用mongosh快速登录mongodb数据库&#xff0c; 操作方法: M-x mongosh, 输入数据库名称&#xff0c;然后就可以自动登录&#xff0c;前提是你已经配置好了…...

《MySQL数据库从零搭建到高效管理|库的基本操作》

目录 一、数据库的操作 1.1 展示数据库 1.2 创建数据库 1.3 使用数据库 1.4 查看当前数据库 1.5 删除数据库 1.6 小结 二、常用数据类型 2.1 数值类型 2.2 字符串类型 2.3 日期类型 一、数据库的操作 打开MySQL命令行客户端&#xff0c;安装完MySQL后会有两个客户端…...

Linux Shell 脚本编程极简入门指南

一、学习前提准备 ✅ 环境要求&#xff1a; Linux系统&#xff08;Ubuntu/CentOS等&#xff09;或 WSL (Windows用户) 任意文本编辑器&#xff08;推荐VSCode/Vim&#xff09; 基础命令行操作能力 &#x1f50d; 验证环境&#xff1a; # 查看系统默认Shell echo $SHELL #…...

多视图几何--相机标定--从0-1理解张正友标定法

1基本原理 1.1 单应性矩阵&#xff08;Homography&#xff09;的建立 相机模型&#xff1a;世界坐标系下棋盘格平面&#xff08;Z0&#xff09;到图像平面的投影关系为&#xff1a; s [ u v 1 ] K [ r 1 r 2 t ] [ X Y 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} K…...

Manus 一码难求,MetaGPT、OpenManus、Camel AI 会是替代方案吗?

Manus 一码难求&#xff0c;MetaGPT、OpenManus、Camel AI 会是替代方案吗&#xff1f; 一、Manus 的现象与问题 Manus 作为一款号称“全球首个通用 AI 智能体”的产品&#xff0c;凭借其强大的功能和新颖的营销策略迅速走红。然而&#xff0c;其封闭的邀请码机制和高昂的使用…...

mac使用Homebrew安装miniconda(mac搭建python环境),并在IDEA中集成miniconda环境

一、安装Homebrew mac安装brew 二、使用Homebrew安装miniconda brew search condabrew install miniconda安装完成后的截图&#xff1a; # 查看是否安装成功 brew list环境变量&#xff08;无需手动配置&#xff09; 先执行命令看能不能正常返回&#xff0c;如果不能正常…...

Linux基础开发工具—vim

目录 1、vim的概念 2、vim的常见模式 2.1 演示切换vim模式 3、vim命令模式常用操作 3.1 移动光标 3.2 删除文字 3.3 复制 3.4 替换 4、vim底行模式常用命令 4.1 查找字符 5、vim的配置文件 1、vim的概念 Vim全称是Vi IMproved&#xff0c;即说明它是Vi编辑器的增强…...