HashMap底层源码,数据结构
HashMap的底层结构在jdk1.7中由数组+链表实现,在jdk1.8中由数组+链表+红黑树实现,以数组+链表的结构为例。


JDK1.8之前Put方法:

JDK1.8之后Put方法:



HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的hashCode方法计算的哈希码值一致导致计算的数组索引值相同)而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(或者红黑树的边界值,默认为 8)并且当前数组的长度大于64时,此时此索引位置上的所有数据改为使用红黑树存储。
补充:将链表转换成红黑树前会判断,即使阈值大于8,但是数组长度小于64,此时并不会将链表变为红黑树。而是选择进行数组扩容。
这样做的目的是因为数组比较小,尽量避开红黑树结构,这种情况下变为红黑树结构,反而会降低效率,因为红黑树需要进行左旋,右旋,变色这些操作来保持平衡 。同时数组长度小于64时,搜索时间相对要快些。所以综上所述为了提高性能和减少搜索时间,底层在阈值大于8并且数组长度大于64时,链表才转换为红黑树。具体可以参考 treeifyBin方法。
当然虽然增了红黑树作为底层数据结构,结构变得复杂了,但是阈值大于8并且数组长度大于64时,链表转换为红黑树时,效率也变的更高效。
相关文章:
HashMap底层源码,数据结构
HashMap的底层结构在jdk1.7中由数组链表实现,在jdk1.8中由数组链表红黑树实现,以数组链表的结构为例。 JDK1.8之前Put方法: JDK1.8之后Put方法: HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,…...
计算机等级考试—信息安全三级真题八
一、单选题...
番外6:下载+安装+配置Linux
#########配置Linux---后续 step08: 点击编辑虚拟机设置,选择下载好的映像文件.iso进行挂载; step09: 点击编辑虚拟机选项,选择UEFI启动模式并点击确定; step10: 点击开启虚拟机,选择Install rhel ; 备注&…...
javascript验证表单字段有效性,使用checkValidity()方法和他的属性
<script type"text/javascript">function LoginCheckValidity(){var txt"";var rmb1document.getElementById("rmb1");if(rmb1.checkValidity()false){if(rmb1.validitionMessageundefined){txt"输入金额有误,金额10-200之间";}…...
pdf怎么调整大小kb?pdf文件过大这样压缩
在日常的工作和生活中,我们常常会遇到需要调整PDF文件大小的问题。有时候,我们需要将大型的PDF文件上传到某些平台,但平台的限制让我们不得不压缩文件的大小。那么,如何有效地调整PDF文件的大小呢? 一、使用嗨格式压缩…...
vue3中的watch
在Vue3中,watch中的参数可以分为两部分,即要监听的响应式数据以及回调函数。 语法格式如下: watch(要监听的响应式数据, 回调函数)除了以上的两个还有其他的参数 immediate:是否在初始化时立即执行一次回调函数,默认…...
开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based
前言 最近看论文遇到了基于反Park变换的锁相环,用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息,实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…...
番外5:下载+安装+配置Linux
任务前期工作: 01. 电脑已安装好VMware Workstation软件; 02.提前下载好Rhel-8.iso映像文件(文件较大一般在9.4GB,建议采用迅雷下载),本人使用的以下版本(地址ed2k://|file|rhel-8.4-x86_64-dvd…...
新手--安装好Quartus II13.0(带modelsim集成包)并用Quartus II搭建一个工程
前言 今天是国庆节,我们正式来学习Quartus II13.0软件的安装与使用。学习verilog与学习C语言都是学习一门语言,那么学习一门语言,光看理论不敲代码绝对是学习不好的。要用verilog语言敲代码,就要像C语言那样搭建起语言的编译环境&…...
python监控软件内存、cpu和GDI
目录 前言代码 前言 最近做软件测试需要监控软件内存、cpu和GDI对象数,用psutil库可以很方便的实现监控内存和CPU,但是GDI好像还不行,最后来的win32api来调用的Windows API接口来实现GDI监控的,在此做个记录。 代码 import psu…...
wordpress搭建自己的博客详细过程以及踩坑
WordPress作为一款开源的内容管理系统(CMS),具有诸多优势。首先,它的易用性使得即使对于没有编程经验的用户来说也能轻松上手,通过直观的用户界面和友好的管理工具,用户可以方便地创建、编辑和发布内容。其…...
在jupyter中更改、增加内核
今天在配置llama2的环境,在学院实验室的服务器上面用jupyter,怎么都不会增加内核。今天说一下怎么把创建好的conda环境增加到jupyter列表中。 例如我有个环境叫做llama2,很简单只要两步。 第一步先激活conda环境。 conda activate llama2第…...
Redis代码实践总结(二)
使用 CLI 探索 Redis 外部程序使用 TCP 套接字和 Redis 特定协议与 Redis 进行通信。该协议在不同编程语言的 Redis 客户端库中实现。然而,为了使使用 Redis 进行黑客攻击变得更简单,Redis 提供了一个命令行实用程序,可用于向 Redis 发送命令…...
读取一张图片各种颜色占比
提问之初 <small> 读取一张图片各种颜色占比 /storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg有趣优雅热情沉着的代码与注释/每行每行 from PIL import Image # 导入PIL大法,这是处理图像的必备神器# 图片路径,此处为…...
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强
前言:在第三章我们介绍了顺序结构程序设计。在顺序结构中,各个语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必做任何判断。是这最简单的程序结构。实际上,在很多情况…...
Blued引流脚本
于多数人来说,引流都是一个比较困难的操作,因为流量不会听你的。所以任何人在网上做生意,或者开一个实体店,都会为流量而发愁,其实对于流量的吸引来说,我们越是刻意为之,可能所获得的效果也越不…...
数据结构之美:如何优化搜索和排序算法
文章目录 搜索算法的优化1. 二分搜索2. 哈希表 排序算法的优化1. 快速排序2. 归并排序 总结 🎉欢迎来到数据结构学习专栏~数据结构之美:如何优化搜索和排序算法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客&#x…...
Unity 鼠标悬浮时文本滚动(Text Mesh Pro)
效果 直接将脚本挂载在Text Mesh Pro上,但是需要滚动的文本必须在Scroll View中,否侧会定位错误,还需要给Scroll View中看需求添加垂直或者水平布局的组件 代码 using System.Collections; using System.Collections.Generic; using UnityE…...
GNN PyG~torch_geometric 学习理解
目录 1. PyG Introduction 2. PyG Installation 2.1 PyG 安装常见错误及原因 2.2 PyG 具体安装步骤 3. torch_geometric packages torch_geometric.data.Data Dataset 与 DataLoader Dropout、BatchNorm 3. torch_geometric: 理解edge_index 3.1 理解 mini-batch edg…...
ChatGPT 调教指南:从 PDF 提取标题并保存
一、请使用python编写一段代码,使用pymupdf包从pdf中提取标题,保存标题名称和页数。 我没有加任何的答案提示,看看 GPT 如何反应。它应该是知道 PDF 没有任何语义信息,一切标题或者正文全是文本框。 好的,以下是使用py…...
Openclaw中文版快速上手:nanobot镜像支持Qwen3-4B本地部署与系统命令执行
Openclaw中文版快速上手:nanobot镜像支持Qwen3-4B本地部署与系统命令执行 1. 快速了解nanobot:你的轻量级AI助手 nanobot是一个超轻量级的个人人工智能助手,它基于OpenClaw的设计理念,但用更简洁的代码实现了核心功能。这个工具…...
Qwen3-VL量化版实测:8bit精度仅降0.13%的奥秘
Qwen3-VL量化版实测:8bit精度仅降0.13%的奥秘 【免费下载链接】Qwen3-VL-8B-Instruct-w8a8s-310 项目地址: https://ai.gitcode.com/Eco-Tech/Qwen3-VL-8B-Instruct-w8a8s-310 导语:阿里云Qwen3-VL视觉语言模型推出8bit量化版本Qwen3-VL-8B-Inst…...
Open Interpreter实时流处理:Kafka消费脚本部署案例
Open Interpreter实时流处理:Kafka消费脚本部署案例 1. 项目背景与需求场景 在实际的数据处理项目中,我们经常需要处理实时数据流。想象一下这样的场景:你的电商平台每秒钟产生成千上万的用户行为数据,这些数据通过Kafka消息队列…...
ollama部署本地大模型|translategemma-4b-it效果对比:vs NLLB-3B、vs SeamlessM4T-v2
ollama部署本地大模型|translategemma-4b-it效果对比:vs NLLB-3B、vs SeamlessM4T-v2 想在自己电脑上跑一个翻译模型,但又担心模型太大、速度太慢?今天我们来聊聊一个轻量级的新选择——Google推出的TranslateGemma-4b-it。更重要…...
YimMenu终极指南:5大核心功能打造安全的GTA5增强体验
YimMenu终极指南:5大核心功能打造安全的GTA5增强体验 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMe…...
百川2-13B中文优势:OpenClaw在本地化办公场景中的特殊优化技巧
百川2-13B中文优势:OpenClaw在本地化办公场景中的特殊优化技巧 1. 为什么选择百川2-13B处理中文办公文档 去年我在整理团队季度报告时,曾尝试用多个开源模型处理中文PDF和微信群聊记录。当通用英文模型遇到中文标点符号和行业术语时,要么漏…...
别再只盯着高分框了!手把手教你用ByteTrack的‘两次匹配’搞定遮挡目标跟踪
ByteTrack实战:如何用两次匹配机制解决遮挡目标跟踪难题 在智慧交通路口,一辆公交车缓缓驶过摄像头,紧随其后的摩托车因完全被遮挡而"消失"在系统中;商场监控画面里,密集人群中突然蹲下系鞋带的顾客被算法判…...
老旧Mac升级指南:OpenCore Legacy Patcher实现Monterey系统适配
老旧Mac升级指南:OpenCore Legacy Patcher实现Monterey系统适配 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着macOS系统不断迭代,许多经典Ma…...
如何快速使用wiliwili:Switch本地视频播放完全指南
如何快速使用wiliwili:Switch本地视频播放完全指南 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端,目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili …...
嵌入式系统错误处理机制与实现
嵌入式系统中的错误处理机制深度解析1. 错误概念与分类1.1 错误分类体系在嵌入式系统开发中,错误处理是确保系统可靠性的关键环节。从严重性维度分析,程序错误可分为两类:致命性错误:系统无法执行恢复操作,典型处理方式…...
