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

深入理解HashMap:Hash冲突的解决机制

引言

HashMap 是 Java 集合框架中最常用的数据结构之一,它通过键值对的形式存储数据,并利用哈希算法实现高效的插入、删除和查询操作。然而,在实际使用中,由于哈希函数的有限性和哈希桶数量的限制,不可避免地会出现 哈希冲突(即不同的键映射到同一个哈希桶)。本文将深入探讨 HashMap 如何解决哈希冲突,并结合源码和 Mermaid 图表帮助你更好地理解其工作机制。


一、什么是哈希冲突?

哈希冲突是指两个或多个不同的键通过哈希函数计算后,被映射到同一个哈希桶中的情况。例如,假设我们有一个简单的哈希函数:

hash(key) = key % 10

如果键 1222 同时插入到哈希表中,它们都会被映射到索引 2 的位置,从而引发哈希冲突。

为了解决这个问题,HashMap 使用了两种主要策略:

  1. 链地址法(Chaining):在每个哈希桶中使用链表或红黑树存储冲突的元素。
  2. 开放地址法(Open Addressing):通过探测其他空闲的桶来存储冲突的元素(Java 的 HashMap 并未采用此方法)。

Java 的 HashMap 主要采用 链地址法 来解决哈希冲突。


二、HashMap 的内部结构
1. 数据结构概览

HashMap 的底层实现基于数组 + 链表/红黑树的混合结构:

  • 数组:称为哈希桶(Bucket),用于存储键值对的引用。
  • 链表:当发生哈希冲突时,冲突的键值对会以链表的形式存储在同一个桶中。
  • 红黑树:当链表长度超过一定阈值(默认为8)且数组长度达到一定条件时,链表会转换为红黑树以提高查询效率。
2. 关键参数
  • 初始容量(Initial Capacity):默认为 16(2^4)。
  • 负载因子(Load Factor):默认为 0.75,表示哈希表在扩容前允许的最大填充比例。
  • 扩容阈值(Threshold)capacity * load factor,当元素数量超过该值时,触发扩容。

三、解决哈希冲突的核心机制
1. 链地址法

链地址法是 HashMap 解决哈希冲突的主要方式。当多个键映射到同一个桶时,这些键值对会被存储在一个链表中。如果链表长度超过阈值(默认为 8),链表会转换为红黑树以优化查询性能。

以下是 HashMap 中处理冲突的关键代码片段:

static class Node<K, V> implements Map.Entry<K, V> {final int hash;final K key;V value;Node<K, V> next; // 指向下一个节点,形成链表Node(int hash, K key, V value, Node<K, V> next) {this.hash = hash;this.key = key;this.value = value;this.next = next;}public final K getKey() { return key; }public final V getValue() { return value; }public final String toString() { return key + "=" + value; }public final V setValue(V newValue) {V oldValue = value;value = newValue;return oldValue;}public final boolean equals(Object o) {if (!(o instanceof Map.Entry)) return false;Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;return Objects.equals(key, e.getKey()) &&Objects.equals(value, e.getValue());}public final int hashCode() {return Objects.hashCode(key) ^ Objects.hashCode(value);}
}
2. 红黑树优化

当链表长度超过阈值(默认为 8)且数组长度达到 64 时,链表会转换为红黑树。以下是红黑树节点的定义:

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;            // 是否为红色节点TreeNode(int hash, K key, V value, Node<K, V> next) {super(hash, key, value, next);}// 其他红黑树相关方法...
}
3. 插入与查找过程

插入和查找时,HashMap 首先通过哈希函数计算键的索引位置,然后根据该位置的桶是否存在冲突进行处理:

  • 如果桶为空,则直接插入新节点。
  • 如果桶中存在冲突,则遍历链表或红黑树查找目标键。

以下是插入操作的部分源码:

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {Node<K, V>[] tab;Node<K, V> p;int n, i;// 初始化哈希表if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;// 计算索引位置并检查是否为空if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);else {Node<K, V> e;K k;// 检查是否为重复键if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;else if (p instanceof TreeNode)e = ((TreeNode<K, V>) p).putTreeVal(this, tab, hash, key, value);else {// 遍历链表查找目标键for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);if (binCount >= TREEIFY_THRESHOLD - 1) // 转换为红黑树treeifyBin(tab, hash);break;}if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}// 更新已有键的值if (e != null) {V oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;// 检查是否需要扩容if (++size > threshold)resize();afterNodeInsertion(evict);return null;
}

四、UML图表展示

以下是一个 HashMap 插入过程的 UML 图表示例,展示了哈希冲突的解决过程:

桶0
桶1
桶2
桶3
键A
键B
节点A
节点B

五、总结

通过本文的讲解,我们深入了解了 HashMap 如何通过链地址法和红黑树优化来解决哈希冲突。链地址法提供了灵活的冲突处理方式,而红黑树则在链表过长时显著提升了查询性能。希望这篇文章能帮助你更好地理解 HashMap 的工作机制,并在实际开发中合理使用这一强大的工具。

如果你对 HashMap 有更多疑问或想要了解更多细节,请随时留言!

相关文章:

深入理解HashMap:Hash冲突的解决机制

引言 HashMap 是 Java 集合框架中最常用的数据结构之一&#xff0c;它通过键值对的形式存储数据&#xff0c;并利用哈希算法实现高效的插入、删除和查询操作。然而&#xff0c;在实际使用中&#xff0c;由于哈希函数的有限性和哈希桶数量的限制&#xff0c;不可避免地会出现 哈…...

Datawhale AI春训营二期---使用AI实现老人的点餐效果(关于task2的相关思考)

文章目录 1.多次测试的结果2.分数是如何提高的3.关于上分点拨4.关于task2的收获 1.多次测试的结果 第一次和第二次的&#xff0c;都是使用的baseline: 第三次的&#xff1a; 2.分数是如何提高的 之前的几次都是通过这个baseline进行运行的&#xff0c;然后今天是了解了一下这…...

摩尔投票法详细介绍

原理 摩尔投票法&#xff08;Boyer-Moore Voting Algorithm&#xff09;是一种用于在存在多数元素的数组中&#xff0c;高效找出出现次数超过数组长度一半的元素的算法。其核心思想是通过元素抵消策略&#xff0c;逐步缩小候选范围&#xff0c;最终确定多数元素。 核心假设&a…...

DP之书架

现按一定顺序给出所有要放置于书架上的书&#xff0c;共有 n 本&#xff0c;第 i 本书有一个长度 hi​。 书架有若干层&#xff0c;层与层之间的宽度不一定相等&#xff0c;但是一层的宽度不能小于其上所摆放的任何一本书的长度。同时&#xff0c;每层上的书的长度之和不能超过…...

Python Cookbook-6.11 缓存环的实现

任务 你想定义一个固定尺寸的缓存&#xff0c;当它被填满时&#xff0c;新加入的元素会覆盖第一个(最老的)元素。这种数据结构在存储日志和历史信息时非常有用。 解决方案 当缓存填满时&#xff0c;本节解决方案及时地修改了缓存对象&#xff0c;使其从未填满的缓存类变成了…...

计算机网络基本概念

层次名称主要功能第七层应用层直接面向用户&#xff0c;提供应用服务&#xff08;如浏览网页、发邮件&#xff09;第六层表示层处理数据格式、加密解密、压缩解压第五层会话层建立、管理、终止会话&#xff08;连接&#xff09;第四层传输层提供端到端的数据传输&#xff08;如…...

Eigen线性代数求解器(分解类)

1. 核心分解类概览 Eigen 提供多种矩阵分解方法&#xff0c;适用于不同矩阵类型&#xff08;稠密/稀疏、正定/非正定等&#xff09;&#xff1a; 分解类适用矩阵类型分解形式典型应用场景PartialPivLU方阵&#xff08;可逆&#xff09;APLUAPLU通用线性方程组求解FullPivLU任…...

【Android】四大组件之Service

目录 一、什么是Service 二、启停 Service 三、绑定 Service 四、前台服务 五、远程服务扩展 六、服务保活 七、服务启动方法混用 你可以把Service想象成一个“后台默默打工的工人”。它没有UI界面&#xff0c;默默地在后台干活&#xff0c;比如播放音乐、下载文件、处理…...

VO包装类和实体类分别是什么?区别是什么?

VO包装类和实体类 1. 实体类&#xff08;Entity Class&#xff09;是什么&#xff1f;2. VO包装类&#xff08;Value Object Class&#xff09;是什么&#xff1f;3. VO包装类和实体类的区别4. 实际应用中的区别5. 举例5.1. 实体类&#xff08;Entity Class&#xff09;的定义与…...

如何创建一个C#项目(基于VS2022版)

一.先找到要保存项目的位置,新建一个文件夹 二.打开VisualStudio,选择创建新项目 三.选择模版: 选择操作语言和操作系统 这个是跨平台的 初学在windows系统上,可选择其他,下面这个是不带窗体模版 也可根据需要选择带窗体模版 点击下一步 填写项目名称,选择项目保存位置,填写解…...

RabbitMQ 四种交换机(Direct、Topic、Fanout、Headers)详解

本文是博主在梳理 RabbitMQ 知识的过程中&#xff0c;将所遇到和可能会遇到的基础知识记录下来&#xff0c;用作梳理 RabbitMQ 的整体架构和功能的线索文章&#xff0c;通过查找对应的知识能够快速的了解对应的知识而解决相应的问题。 文章目录 一、直连交换机&#xff08;Dire…...

聚合分销系统开发:短剧小说外卖网盘电商cpscpa系统

聚合分销系统是一种整合了多种分销项目和功能的综合性平台&#xff0c;其核心在于通过CPS&#xff08;按销售付费&#xff09;和CPA&#xff08;按行为付费&#xff09;两种模式&#xff0c;为推广者提供多样化的赚钱机会。以下是聚合分销系统的主要项目和功能&#xff1a; 一…...

【Flume 】Windows安装步骤、配置环境

&#x1f6e0; Flume 是什么&#xff1f; Apache Flume 是一个高效、可靠、可扩展的数据收集系统&#xff0c;通常用于收集日志、流数据&#xff0c;比如收集数据到 HDFS、Kafka 等。 虽然 Flume 本身是为 Linux 服务器设计的&#xff0c;但 在 Windows 本地也是能跑起来的&a…...

【信息系统项目管理师】高分论文:论质量管理和进度管理(智慧旅游平台建设项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划质量管理2、质量保证3、质量控制论文 2019年3月,我作为项目经理,参加了某市智慧旅游平台建设项目,负责项目的全面管理, 该项目以打造一流的国内外生态旅游城市为目标,旨在大数据云平台建设的基…...

一致性哈希详解:优雅地扩展分布式系统

引言 对于哈希算法&#xff0c;相信大家一定不会陌生。它经常被用在负载均衡、分库分表等场景中。例如&#xff0c;在进行分库分表时&#xff0c;我们可能初步根据业务分析&#xff0c;确定 128 张表足以满足当前的数据量需求。此时&#xff0c;当需要插入或查询一条记录时&am…...

pytest 技术总结

目录 一 pytest的安装&#xff1a; 二 pytest有三种启动方式&#xff1a; 三 用例规则&#xff1a; 四 配置框架&#xff1a; 一 pytest的安装&#xff1a; pip install pytest # 安装 pip install pytest -U # 升级到最新版 二 pytest有三种启动方式&#xff1a; 1…...

数据库MySQL学习——day5(总结与复习实践)

文章目录 1、复习总结1.1. 数据库基础1.2. 表操作1.3. 数据操作1.4. 更新与删除 2、实践任务&#xff1a;创建学生管理系统数据库2.1. 数据库设计2.2. 创建表的SQL语句2.3. 插入示例数据2.4. 查询与数据操作示例 3、调试与练习4、 今日小结 1、复习总结 1.1. 数据库基础 数据…...

unity bug

发现一个奇怪的bug&#xff0c;就是某些unity版本打包apk时候不允许StreamingAssets里面有中文文件或者中文路径。比如下图这面这俩都是不行的。 解决方案&#xff1a;中文改为英文即可。 一般报错信息如下&#xff1a; > Configure project :launcher WARNING:The option s…...

苹果计划2026年底前实现美版iPhone“印度造”,以减轻关税及地缘政治风险

基于 6 个来源 据多家媒体报道&#xff0c;苹果公司计划在2026年底前&#xff0c;实现在印度组装销往美国的大部分或全部iPhone手机&#xff0c;以减轻关税和地缘政治紧张局势带来的风险。这一目标意味着苹果需将印度的iPhone产量增加一倍以上&#xff0c;凸显其供应链多元化战…...

新增Webhook通知功能,文档目录树展示性能优化,zyplayer-doc 2.5.1 发布啦!

zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具&#xff0c;支持在线编辑富文本、Markdown、表格、Office文档、API接口、思维导图、Drawio以及任意的文本文件&#xff0c;支持基于知识库的AI问答&#xff0c;专为私有化部署而设计&#xff0c;最大程度上保证企业或…...

【量化交易笔记】17.多因子的线性回归模型策略

前言 上一篇介绍了 因子的评价和分析方法&#xff0c;让我知道如何判断该因子的作用&#xff0c;以及对最终结果的影响&#xff0c;其最大的问题&#xff0c;他只能评价和分析单因子&#xff0c;而对多个因子&#xff0c;不能直接加以评价。我们自然会想到&#xff0c;如果是多…...

五年经验Java开发如何破局创业

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息文章目录 五年经验Java开发如何破局创业一、创业方向筛选与优劣势分析**方向1:技术教育/在线课程开发****方向2:企业级技术服务外包****方向3:技…...

定制一款国密浏览器(11):SM2算法的椭圆曲线参数定义

在国密算法中,SM2 算法是最复杂的,不仅是算法本身比较复杂,其应用场景也复杂。不管 SM2 算法本身有多复杂,作为开发者,我们需要知道的是 SM2 算法是建立在椭圆曲线算法(ECC)之上。关于 SM2 算法和椭圆曲线算法之间的关系,参考我之前的一篇文章: 解读国密非对称加密算…...

RAG技术与应用---0426

大语言模型>3.10 课程中会用到python 工具箱&#xff1a; faiss,modelscope,langchain,langchain_community&#xff0c;PyPDF2 1&#xff09;大模型应用开发的三种模式 提示词没多少工作量&#xff0c;微调又花费时间费用&#xff0c;RAG是很多公司招聘用来对LLM进行应用…...

STM32的开发环境介绍

目录 STM32软件环境 Keil软件在线安装 其他软件环境安装 STM32开发的几种方式 STM32寄存器版本和库函数版本 标准外设库的作用&#xff1a; STM32软件环境 STM32 的集成开发环境&#xff08;IDE&#xff09;&#xff1a;编辑编译软件 常见的环境&#xff1a; (1)KEIL&a…...

【生成式AI】从原理到实践的创造性革命

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;文生图&#xff09; 三、性能对比测试方法论量化数据对比结果分析 四、最佳实践推荐方…...

Win下Pycharm运行/调试配置脚本形参执行替换Linux下终端执行,进行调试需要注意的

Linux下终端执行 python demo/image_demo.py demo/demo.jpg rtmdet_tiny_8xb32-300e_coco.py --weights rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth --device cpuWin下Pycharm运行/调试配置脚本形参执行 主要改红色两处 如果工作目录正确&#xff0c;脚本形参…...

Pytorch(无CPU搭建)+Jupyter

2024年最新最简洁深度学习环境配置&#xff1a;AnacondaPyTorch(CPU、GPU)VScodePycahrm_哔哩哔哩_bilibili 跟 PyCharm說再見, [VSCode] PythonJupyter 超牛逼的功能 ! 5分鐘大幅提升編碼效率~ 數據分析、AI大神必備_哔哩哔哩_bilibili...

类的高级特性与语法细节

static 静态关键字 Java中的static关键字用于修饰类的成员&#xff08;属性或方法&#xff09;&#xff0c;表示“静态”的含义&#xff0c;即属于类本身&#xff0c;而非某个对象。静态成员在内存中只有一份&#xff0c;在类加载时初始化&#xff0c;生命周期贯穿程序运行始终…...

基于 RAG 的 Text2SQL 全过程的 Python 实现详解,结合 LangChain 框架实现自然语言到 SQL 的转换

什么是RAG 一、核心流程&#xff1a;三阶段协同 RAG的核心流程分为检索&#xff08;Retrieval&#xff09;、增强&#xff08;Augmentation&#xff09;、生成&#xff08;Generation&#xff09;三个阶段&#xff0c;形成“检索→知识整合→生成”的闭环。 1. 检索&#xff…...

使用 OpenCV 进行视觉图片调整的几种常见方法

以下是使用 OpenCV 进行视觉图片调整的几种常见方法&#xff1a; 调整图片大小 指定目标尺寸&#xff1a;使用cv2.resize()函数&#xff0c;通过设定目标图像的宽度和高度来调整图片大小。例如&#xff0c;将图片调整为 200x200 像素&#xff1a; import cv2 image cv2.imre…...

【特殊场景应对9】视频简历的适用场景与风险分析

写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…...

Dify 1.3.0 为 LLM 节点引入了结构化输出支持

Dify 1.3.0 为 LLM 节点引入了结构化输出支持 0. 引言1. 使用方法 0. 引言 Dify 1.3.0 开始&#xff0c;在 LLM 节点支持结构化输出&#xff1a;Dify 已经为 LLM 节点引入了结构化输出支持。这意味着您的语言模型现在可以返回整齐组织且易于处理的数据。后端实现由 Nov1c444 在…...

【Linux网络】HTTP协议全解析 - 从请求响应到方法与Header

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

JSP实现用户登录注册系统(三天内自动登录)

JSP实现用户登录注册系统 引言 在Web开发中&#xff0c;用户认证是最基础且核心的功能之一。本文基于JSP技术&#xff0c;实现了一个包含注册、登录、自动登录&#xff08;3天内&#xff09;、退出等功能的用户系统&#xff0c;并在过程中解决了Cookie字符错误、错误信息回显…...

大数据模型现状分析

大数据模型现状分析 一、引言 在当今数字化时代&#xff0c;数据以前所未有的速度增长&#xff0c;大数据已成为推动各行业发展的核心动力。大数据模型作为挖掘数据价值的关键工具&#xff0c;正受到广泛关注与深入研究。通过对海量、多样且高速产生的数据进行处理和分析&…...

代码随想录算法训练营第二十八天

LeetCode题目: 509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯2444. 统计定界子数组的数目(每日一题) 其他: 今日总结 往期打卡 动态规划解题步骤: 确定递推公式确定遍历顺序记忆化搜索(确定dp数组以及下标的含义与初始化值)递推优化与空间优化 509. 斐波那契数 跳转: 5…...

HTML与安全性:XSS、防御与最佳实践

HTML 与安全性&#xff1a;XSS、防御与最佳实践 前言 现代 Web 应用程序无处不在&#xff0c;而 HTML 作为其基础结构&#xff0c;承载着巨大的安全责任。跨站脚本攻击&#xff08;XSS&#xff09;仍然是 OWASP Top 10 安全威胁之一&#xff0c;对用户数据和网站完整性构成严…...

三维重建(二十)——思路整理与第一步的进行

文章目录 一、整体思路二、细分三、之前存在问题四、任务安排五、第一步——找到内参并选定一种5.1 train的RTK5.2 test的RTK5.3 各选择一个5.3.1 train-185.3.2 test-193一、整体思路 这部分主要是宏观的讲一下整体框架。 从gshell里面提取核心参数,放入py3d,渲染出图片,…...

判断 ONNX 模型是否支持 GPU

&#x1f50d; 判断 ONNX 模型是否支持 GPU 的几个关键点&#xff1a; ✅ 1. 检查模型支持的 Execution Provider 可以通过下面的代码打印出来当前模型使用了什么设备&#xff1a; 需要安装好&#xff1a;onnxruntime-gpu import onnxruntime as ort session ort.InferenceSe…...

CANFD技术在实时运动控制系统中的应用:协议解析、性能测试与未来发展趋势

摘要&#xff1a; 本文深入探讨了CANFD技术在实时运动控制系统中的应用。通过对传统CAN协议与CANFD协议的对比分析&#xff0c;详细阐述了CANFD在提升数据传输效率、增强系统实时性与稳定性方面的优势。文章结合具体测试案例&#xff0c;对CANFD总线的性能指标进行了全面评估&a…...

Java基础 4.26

1.访问修饰符细节 package com.logic.modifier;public class A {public int n1 100;protected int n2 200;int n3 300;private int n4 400;public void m1() {//在同一个类中 可以访问public protected 默认 private 修饰属性和方法System.out.println(n1 " " …...

山东大学离散数学第九章习题解析

参考教材&#xff1a;离散数学教程&#xff0c;徐秋亮 / 栾俊峰 / 卢雷 / 王慧 / 赵合计 编著&#xff0c;山东大学计算机科学与技术学院 注&#xff1a;该解析为个人所写&#xff0c;涵盖了 2022-2023-2 学期赵合计老师所布置的所有课本习题&#xff1b;由于学识、认识及经验…...

5G融合消息PaaS项目深度解析 - Java架构师面试实战

5G融合消息PaaS项目深度解析 - Java架构师面试实战 场景&#xff1a;互联网大厂Java求职者面试&#xff0c;面试官针对5G融合消息PaaS项目进行提问。 第一轮提问 面试官&#xff1a;马架构&#xff0c;请简要介绍5G融合消息PaaS平台的核心功能和应用场景。 马架构&#xff…...

React-Redux

1、安装 npm i redux react-redux reduxjs/toolkit 2、基础使用方式&#xff08;无 Toolkit&#xff09; &#xff08;1&#xff09;核心Api createStore&#xff1a;创建数据仓库&#xff1b;store.dispatch()&#xff1a;用于派发action&#xff0c;执行修改动作&#xf…...

Linux基础篇、第4章_03系统磁盘高级管理LVM 逻辑卷管理器

题目&#xff1a;系统磁盘高级管理LVM 逻辑卷管理器 版本号: 1.0,0 作者: 老王要学习 日期: 2025.04.26 适用环境: Centos7 文档说明 本文档聚焦于 Centos7 系统下的磁盘高级管理&#xff0c;围绕 LVM 逻辑卷管理器展开。详细介绍了物理卷、卷组和逻辑卷的创建、管理与删除操…...

代码随想录算法训练营Day36

力扣1049.最后一块石头的重量Ⅱ【medium】 力扣474.一和零【meidum】 一、力扣1049.最后一块石头的重量Ⅱ【medium】 题目链接&#xff1a;力扣1049.最后一块石头的重量Ⅱ 视频链接&#xff1a;代码随想录 1、思路 把这个问题转换成尽可能将 stones 分成两个等分子集&#xf…...

iperf网络性能测试

iperf 是一个网络性能测试工具&#xff0c;用于测量网络带宽、延迟、抖动等性能指标。它支持 TCP 和 UDP 协议&#xff0c;可以在客户端和服务器模式下运行&#xff0c;广泛用于网络性能评估和故障排查。 主要功能 带宽测试&#xff1a;测量网络的最大可用带宽。延迟测试&…...

基于 Nginx 的 WebSocket 反向代理实践

一、HTTP 协议升级机制回顾 Upgrade/Connection 报头 客户端发起 WebSocket 握手时&#xff0c;会在普通 HTTP 请求中加入Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: <随机值> Sec-WebSocket-Version: 13服务端若接受协议切换&#xff0c;会以 101 Swit…...

C++ 同步原语

同步原语&#xff08;Synchronization Primitives&#xff09;是操作系统和编程语言提供的基本工具&#xff0c;用于在多线程或并发环境中协调线程&#xff08;或进程&#xff09;之间的执行顺序&#xff0c;管理共享资源的访问&#xff0c;以避免数据竞争&#xff08;data rac…...