Java高频面试之集合-10

news2025/3/13 16:25:12

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在高冲突场景下的最优解。

在这里插入图片描述

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

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

相关文章

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 前进/后…

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

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

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

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

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;下面…

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…

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

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

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编辑器的增强…

【C++】数据结构 队列的实现

本篇博客给大家带来的是用C语言来实现数据结构的队列的实现&#xff01; &#x1f41f;&#x1f41f;文章专栏&#xff1a;数据结构 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享&#xff01; 今日思想&#xff1a;你…

macOS 终端优化

macOS 安装、优化、还原、升级 Oh My Zsh 完全指南 &#x1f680; Oh My Zsh 是 macOS 终端增强的利器&#xff0c;它能提供强大的自动补全、主题定制和插件支持&#xff0c;让你的终端更高效、更炫酷。本文将全面介绍 如何安装、优化、还原、重新安装和升级 Oh My Zsh&#x…

大语言模型-1.2-大模型技术基础

简介 本博客内容是《大语言模型》一书的读书笔记&#xff0c;该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

Flutter 按钮组件 TextButton 详解

目录 1. 引言 2. TextButton 的基本用法 3. 主要属性 4. 自定义按钮样式 4.1 修改文本颜色 4.2 添加背景色 4.3 修改按钮形状和边距 4.4 样式定制 5. 高级应用技巧 5.1 图标文本组合 5.2 主题统一配置 5.3 动态交互 6. 性能优化与注意事项 6.1 点击区域优化 6.…

Qt 数据库操作(Sqlite)

数据库简介 关于数据库的基础知识这里就不做介绍了&#xff0c;相关博客可以查看&#xff1a; SQL基础知识 数据库学霸笔记 上面博客都写的比较详细&#xff0c;本文主要介绍如何使用Qt进行数据库相关操作&#xff0c;数据库分为关系型数据库和非关系型数据&#xff0c;关系…