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

问HashMap底层原理?

HashMap是基于数组+链表+红黑树的哈希表。用于存储键值对。

1.哈希计算和扰动处理,也就是Hash方法

每一个Object都有一个 .hashCode 方法。

  1. (哈希计算)在对hashmap进行插入和查询时,先调用key键的key.hashCode()方法获取一个未处理的int哈希值,在底层代码中该值被复制给变量h
  2. (扰动处理)通过异或运算,也就是一位一位比较,如果不同就是1,如果相同就是0。h^(h>>>16)>>>无符号右移操作符,它会将 h 的二进制表示向右移动 16 位,高位用 0 填充,这样就可以将高位的信息混入低位,让哈希值在低位也均匀分布,减少碰撞。

2.索引定位

在原来手动计算的时候,我们是通过取模运算来确定的。在底层是通过(n-1)&hash计算哈希桶bucket下标,效率比取模更高。(原理)

为什么用这个公式?

  1. n-1,在进行了2^n-1后,低位全是1,高位全是0。变成了低位全1的掩码。
  2. 取模运算是算数运算,位运算是底层硬件级操作。且hash&(n-1)hash%n结果完全一样
  3. 20%16=4,20=00010100,20&15=00000100=4

​ 00001111

3.冲突处理

  1. 如果桶的位置为空直接放入新大街店
  2. 如果存在节点,就逐个比较,如果equals()相等就覆盖value,否则追加到链表尾部
  3. 当单个桶中的节点数查过8且数组容量>=64,链表会转换成红黑树来降低最坏复杂度O(log n)

4.扩容机制

  • 默认初始数组长度是16,负载因子是0.75
  • 当元素超过阈值,数组扩容两倍,并重新分配节点位置
  • 扩容后的新下标计算不是不是重新算hashCode,而是用(node.hash&oldCap)判断要留在原位置还是移动到原位置+oldCap。如果端出来的数值是0就放到相应原位置,否则放到原数组长度+目前索引的位置。(原理)
  • )HashMap扩容时,node.hash & oldCap的作用是快速确定节点在新数组中的位置。由于oldCap是2的幂次方,其二进制只有一位为1,其余全为0,因此按位与运算的结果仅由节点哈希值中与该位对应的那一位决定——若该位为0,结果为0,节点在新数组中的位置与原位置相同;若该位为1,结果等于oldCap,节点新位置则为原位置加上oldCap。这种设计的巧妙之处在于,每次扩容都以2倍增长(保持2的幂次方),使得oldCap的二进制独有的1位会左移一位,刚好对应新容量比旧容量多出的判断位,通过一次简单的位运算就能完成节点分流,大幅提升扩容效率。
if((node.hash&oldCap)==0)-->放到newTable[i]
else 						放到newTable[i+oldCap]

相关文章:

问HashMap底层原理?

HashMap是基于数组+链表+红黑树的哈希表。用于存储键值对。 1.哈希计算和扰动处理,也就是Hash方法 每一个Object都有一个 .hashCode 方法。(哈希计算)在对hashmap进行插入和查询时,先调用key键的key.hashCode()方法获取一个未处理的int哈希值,在底层代码中该值被复制给变量…...

用 Go 重写 adbkit:原理、架构与搭建实践

用 Go 重写 adbkit:原理、架构与搭建实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impor…...

C语言环境搭建之Linux子系统使用vscode连接子系统

安装准备工作查看当前系统版本确保高于16215.0开启WSL Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。安装步骤微软商城Microsoft Store安装Ubuntu(本人安装的版本是22.04)点击等待安装完成输入用户名跟…...

移远AT指令笔记

# 测试 AT - 测试AT指令功能是否正常# 模块相关 ATI - 查询模块信息 AT+CGMI - 查询模块制造商标识 AT+CGMM - 查询模块型号 AT+CGMR - 查询模块固件版本号# 网络相关 AT+QCCID - 查询集成电路卡识别码(ICCID) AT+GSN …...

数据类型

数据类型bool string byte int,uint,int8,int16,uint16,int32,uint32,int64,uint64 float32,float64,complex,complex64,complex128 rune uintptr 无符号整型,用于存放一个指针,该类型用于指针计算 结构类型 指针类型 数组 切片 map 集合 interface{} 接口 通道类型 函数类型 时…...

iphone运行windows系统

如何让iPhone运行Windows系统? 一、引言与背景介绍 随着科技的发展,用户对于设备的需求日益多样化。作为智能手机市场的领导者之一,iPhone拥有着强大的硬件性能和优秀的软件生态。然而,有些用户可能会好奇,是否有可能在iPhone上安装并运行Windows操作系统呢?本文将详细介…...

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置指南

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置指南国标GB28181视频平台EasyCVR视频融合平台可拓展性强、视频能力灵活,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、告警、平台级联、云台控制、语音对讲、智能分析接入等功能。 其中,在语音对讲方面,N…...

Ubuntu filebrowser网盘工具安装

第一步,本地部署 FileBrowser 1,本教程使用 Linux Ubuntu 系统进行演示,首先输入以下命令更新软件包列表。 sudo apt-get update 2,访问 FileBrowser 的 GitHub 页面找到最新版本,并根据你的系统架构下载相应的二进制文件。例如,对于 64 位 Linux 系统,可以使用如下 wge…...

图片结构 - voasem

图片分析简介 图像文件有多种复杂的格式,可以用于各种涉及到元数据、信息丢失和无损压缩、校验、隐写或可视化数据编码的分析解密,都是 Misc 中的一个很重要的出题方向。涉及到的知识点很多(包括基本的文件格式,常见的隐写手法及隐写用的软件),有的地方也需要去进行深入的…...

ESP32做AP,ESP8266做station,遥控

ESP8266 (Station模式) → 发送数据 → ESP32 (AP模式) → 接收并处理数据 ESP32 (AP接收端) 代码#include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h>// 设置AP的网络名称和密码 const char *ssid = "ESP32_AP"; const char *passwor…...

实用指南:25年高联:一试填空题解析(下篇)

实用指南:25年高联:一试填空题解析(下篇)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !im…...

Spring AOP 面向切面编程 - 浪矢

目录概念应用例子:在不修改源代码的前提下,对请求链路上的目标方法进行运行耗时的统计。 概念 用于将与业务无关,但是对多个对象产生影响的公共逻辑,抽取并封装为可用模块,模块命名为“切面”(Aspect),减少重复代码,降低耦合度。 应用例子:在不修改源代码的前提下,对…...

jvm内存泄漏的排查tips总结

以下是对这篇原文的总结,部分内容不够详细,请参考原文地址:https://juejin.cn/post/7255634554987020343 内存问题排查方法论 1. 问题定位流程确定进程:使用 ps aux --sort=-%mem 找出内存占用最高的进程 分层排查:按照堆内 → 堆外的顺序逐步分析 量化分析:通过计算得出…...

鼠你爱称重

<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>小鼠体重语音录入工具 - 数字鼠号版</t…...

详细介绍:用户争夺与智能管理:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径

详细介绍:用户争夺与智能管理:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…...

PlorarD(WEB中等)

到底给不给flag呢先看代码 get和post里面必须只有一个发送了flag 如果两个都发送了会是true然后运行exit直接结束代码 再下一个是发送的flag不能是===flag 不然也是一样 之后就是一个循环遍历,把post传的参数当作一个变量名然后参数值当作变量值 输入一个flag=a看一下所以这里…...

神经网络稀疏化设计构架方式和原理深度解析

神经网络稀疏化设计构架方式和原理深度解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

天下拍拍卖系统:二方系统也能扩展三方平台功能

过去很多年,大多数拍卖公司为了快速开展线上拍卖会,普遍选择入驻阿里拍卖、京东拍卖、公拍网等三方平台——功能齐全、流量大、上线快。但随着业务深入,企业逐渐发现三方平台存在一些限制,想要私有化搭建一套属于拍卖公司自己的拍卖系统,但同时可能也想保留一些三方平台的…...

express使用redis

我用的pnpm pnpm add express redisconst express = require(express); const redis = require(redis); var app = express() var port = 3000 // 创建 Redis 客户端实例 const redisClient = redis.createClient({url: redis://172.17.0.185:6379 ,password: b7371d927aec647d…...

day07 课程

day07 课程课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=148 7.1 字典的应用场景7.2 创建字典的语法7.3 字典常用操作之新增7.4 字典常用操作之删除7.5 字典常用操作之修改———————————————————————…...

111

111111111...

排序实现java - 教程

排序实现java - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14p…...

.net core 发布到 iis 步骤

1. 打开服务器管理器,管理,添加角色和功能,把 IIS 相关的全勾上。 2. 安装.net core 环境,需要 ASP.NET Core 运行时的 Hosting Bundle 版本,其他版本没用。 3. 安装 webdeploy, 服务器防火墙打开8172端口。 4. 在 IIS 上创建站点, 配置的文件夹权限需要添加 everyone 的…...

kylin SP2安装mysql8.4.5

环境:OS:kylin SP2mysql:8.4.5 glibc2.17,建议安装glibc.2.28版本 查看系统glibc版本[root@localhost soft]# ldd --version ldd (GNU libc) 2.28 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There i…...

微信社群机器人接口

微信个人号开发API/文档/教程 大家一般需求点无非是以下几个需求: 1.开发个人微信营销系统 2.开发自定义的微信机器人, 3.开发微信智能聊天客服系统 4.定制行业内的群数据分析功能需求很简单,业务代码贼好撸,但是如何和微信交互呢,如何取到微信数据调用相关聊天接口呢,具体…...

C++的枚举类

语法:enum class 枚举类名 [: 底层类型] {枚举值1,枚举值2,... };一般形式(当然我们一般默认成员都显转int,因此底层类型一般不写) C++的枚举类: 在C++中,enum class是一种类型安全的枚举类型,它比传统的enum类型提供了更好的作用域控制和类型安全性。使用enum class可以…...

Revit二次开发 钢筋生成API(一)

1、自由钢筋生成API创建不受约束的自由形式钢筋。以后不能将约束添加到此钢筋。public static Rebar CreateFreeForm(Document doc,RebarBarType barType,Element host,IList<CurveLoop> curves,out RebarFreeFormValidationResult error )通过此方法,可以创建一个或者多…...

方法

什么是方法 方法是程序中最小的执行单位 实际开发中:重复的代码,具有独立功能的代码可以抽取到方法当中 实际开发中方法的好处:可以提高代码的复用性 提高代码的可维护性 最简单的方法定义和调用 方法的格式:把一些代码打包在一起,用到时候就调用 方法定义:把一些代码打包在…...

详细介绍:PHP基础-语法初步(第七天)

详细介绍:PHP基础-语法初步(第七天)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…...

如何通过Python SDK 删除 Collection

本文介绍如何通过Python SDK删除一个已创建的Collection。 重要 删除Collection后,该Collection所有数据将删除且不可恢复,请谨慎操作。 前提条件已创建Cluster:创建Cluster已获得API-KEY:API-KEY管理已安装最新版SDK:安装DashVector SDK接口定义 Python示例: Client.del…...

maven项目连接DM数据库和基本sql使用

maven项目连接DM数据库和基本sql使用直接引入Maven依赖<!-- DM数据库JDBC驱动 --> <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.3.140</version> </dependency>dem…...

【中国计算机学会CCF主办】第六届人工智能、大数据与算法国际学术会议(CAIBDA 2026)

第六届人工智能、大数据与算法国际学术会议(CAIBDA 2026) 2026 6th International Conference on Artificial Intelligence, Big Data and Algorithms (CAIBDA 2026)重要信息 大会时间:2026年6月12-14日 大会地点:天津(线上同步进行) 大会官网:www.caibda.org *为报名…...

图片 - voasem

常用工具binwalkforemostwinhex010filestegsolvezstegF5StegdetectSteghideoutguessexiftoolstegseek解题思路 一.未知文件类型 当文件没有后缀名或者有后缀名却无法打开时,我们需要去识别图片类型 1.可以用file命令进行识别2.通过以下应用查看文件头类型---->然后判断出文…...

图片大全 - voasem

常用工具binwalkforemostwinhex010filestegsolvezstegF5StegdetectSteghideoutguessexiftoolstegseek解题思路 一.未知文件类型 当文件没有后缀名或者有后缀名却无法打开时,我们需要去识别图片类型 1.可以用file命令进行识别2.通过以下应用查看文件头类型---->然后判断出文…...

面试时让你设计一个“朋友圈点赞”功能测试,如何回答才出彩?

希望这篇文章能够帮助你在面试中脱颖而出,不仅拿到心仪的offer,更展现出你作为优秀测试工程师的潜质和能力。祝你面试成功!朋友圈点赞,一个看似简单的功能,背后却涉及复杂的技术逻辑和用户体验考量。当面试官抛出这个问题时,他真正想考察的不是你能想到多少测试点,而是你…...

企训宝教育培训微信小程序系统

1. 概述总结 企训宝教育培训小程序系统包含微信小程序和抖音小程序相关的源码及定制开发服务。其交付方式为微擎系统交付,微擎系统是一款基于 PHP 开发的开源应用生态系统,主要用于快速搭建微信公众号、小程序等应用,同时支持 Web 系统开发与部署,该程序源码未加密,为官方…...

Inventor Professional 2026.1.1 产品设计与工程制图

描述 Autodesk Inventor提供了专业级机械设计、文档编制和产品仿真工具。参数化建模、直接建模、自由形状建模和基于规则的设计功能的强大组合。用于钣金、结构件设计、三维布管、电缆和线束、演示、渲染、仿真、机床设计等的集成工具。值得信赖的 DWG™ 兼容性,强大的基于模型…...

叮当计步微信小程序系统

1. 概述总结 叮当计步小程序系统是基于微擎系统交付的应用,微擎系统是一款基于 PHP 开发的开源应用生态系统,主要用于快速搭建微信公众号、小程序等应用,同时支持 Web 系统开发与部署。该计步系统历经数月研发,投入 20 多万研发费用,注重数据可靠性、系统扩展性和高并发支…...

fetch-event-source踩坑sse(getReader)后续 IOS全量返回问题

这两天在做智能聊天,遇到了和这个博主相同的问题,我按这个改了,https://blog.csdn.net/a598829181/article/details/135913704,但是也停留在IOS会全量返回。 后来试了fetch 模拟,失败,增加各种IOS兼容,web-streams-polyfill,失败。试了event-source-polyfill可以,但是会…...

P12508 「ROI 2025 Day2」程序员的日常

在天数 \(k\) 固定时,定义 \(p_i\) 为第 \(i\) 个连续段的起点。那么一个贪心是在保证第 \(i\) 段的 \(\max=a_{p_i}\) 时尽量最小化 \(a_{p_{i+1}}\)。于是有 \(p_{i+1}=\arg\min\limits\left\{a_j\mid p_i+1\le j\le \min(r_{p_i},n-k+i+1)\right\}\)。注意最后一个位置可能…...

手机上有哪些比较好用的待办事项提醒工具 - 指南

手机上有哪些比较好用的待办事项提醒工具 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace …...

Redis源码学习 -- 数据类型编码 -- List - -蓝蜗牛

1. 什么是List? List​​是Redis的数据类型之一,给用户提供一个双向链表的功能。核心优势是头尾操作O(1)。 2. List的编码模式 List的编码模式有两种:LISTPACK和QUICKLIST。(下文用全大写表示编码名称,首字母大写表示数据结构) Quicklist本身就是节点为Listpack的链表,所…...

乌班图无法登录桌面,只能终端登录用户。且有网拉不了包(DNS问题)

尝试startx解决dns问题 $ sudo vi /etc/resolv.conf 新增nameserver 127.0.1.1 #这里用的是阿里云的DNS服务器 nameserver 223.5.5.5 nameserver 223.6.6.6一定要更新一下 $ sudo apt-get update重新安装桌面$ sudo apt-get install xorg $ sudo apt-get install ubuntu-desk…...

事半功倍是蠢蛋53 tornado接口报错

新写的接口无法访问也不404,log也没有任何输出。 二分找出初始化的时候报错...

完整教程:云手机的技术架构可分为哪些

完整教程:云手机的技术架构可分为哪些pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…...

AI提示词遇见精密算法:TimeGuessr如何用数学魔法打造文化游戏新体验

在人工智能与历史文化的美妙交融中,一套精密的评分算法正在重新定义游戏公平性与挑战性当我们谈论AI生成的文化游戏时,很多人首先想到的是华丽的视觉效果和智能的内容生成。然而,真正让TimeGuessr(https://timeguessr.online/)脱颖而出的,是其背后那套**精密而公平的评分算…...

Arkime:大规模开源网络分析与数据包捕获系统

Arkime是一个开源的大规模网络数据包捕获与分析系统,支持PB级流量处理,提供完整的PCAP存储、索引和搜索功能,帮助安全团队进行网络取证和威胁检测。Arkime:大规模开源网络分析与数据包捕获系统 项目描述 Arkime(前身为Moloch)是一个大规模、开源的网络数据包捕获和分析系…...

kylin SP2安装mysql 8.0.41

环境:OS:kylin SP2mysql:8.0.41 glibc2.17查看系统glibc版本[root@localhost soft]# ldd --version ldd (GNU libc) 2.28 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even…...

SAP采购订单数据获取

最近要配合公司AI做一个采购订单信息获取。 1、根据条件获取采购订单基本信息。 2、得到最早交易记录和最晚交易记录。 3、得出平均含税单价。 4、得出总交易条数。 AI的模型输入因为是不确定的,可能单个问,多个问,各种问,目前定义了采购订单、供应商、物料、日期等维度,这…...

get和post如何理解

基础概念: get主要是获取资源,post主要提交资源 传输链路上区别: get 在URL上携带参数,公开透明,不安全,幂等性(同一个请求多次执行,结果和只执行一次是一样的,不会产生额外的副作用,不会改变服务器的状态) 传递参数数量比较少(一般是2048个字符,但是具体还要看浏…...