HashMap源码分析 (1.基础入门) 学习笔记
本章为 《HashMap全B站最细致源码分析课程》 + 拉钩教育HashMap 学习笔记
文章目录
- 1. HashMap的数据结构
- 1. 数组
- 2. 链表
- 3. 哈希表
- 3.1 Hash
1. HashMap的数据结构
数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。
1. 数组
- 在生成数组的时候数组的长度是固定的,在增加元素时常常会遇到长度不足的问题,此时就需要进行扩容——生成一个更长的数组,并将原数组中所有元素复制到新数组中,这个过程是很消耗资源的,故插入操作比较困难。
- 数组存储区间是连续的,占用内存严重,故空间复杂的很大。
- 数组的二分查找时间复杂度小,为O(1);
- 数组的特点是:寻址容易,插入和删除困难;
2. 链表
- 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,
- 查询时必须从头节点一个个向后查询,时间复杂度很大,达O(N)。
- 链表的特点是:寻址困难,插入和删除容易。
3. 哈希表
- 哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组” ,如图:

- 从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。
- HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value, next,从属性 key,value 我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,
- HashMap其实也是一个线性的数组实现的,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。
- 一般情况下存储规则为: hash(key)%len,也就是元素的key的哈希值对数组长度取模得到
3.1 Hash
- 理论:Hash 也称散列表, 基本原理就是把任意长度的输入,通过Hash变成固定长度的输出。这个映射规则对应的就是 Hash算法,而原始数据映射后的二进制串就是哈希值
- 特点:
- 从 Hash值 不能反向推导出原始数据
- 输入数据的微小变化,会得到完全不一样的hash值。相同数据的得到的hash值完全一样
- Hash 算法执行效率高
- Hash 算法冲突概率较小
- 由于 Hash 的原理是将输入空间的值映射到Hash空间内, 而由于Hash空间远小于输入空间,根据抽屉原理,一定会存在不同输入空间的值映射到相同的hash空间的情况
相关文章:
HashMap源码分析 (1.基础入门) 学习笔记
本章为 《HashMap全B站最细致源码分析课程》 拉钩教育HashMap 学习笔记 文章目录1. HashMap的数据结构1. 数组2. 链表3. 哈希表3.1 Hash1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 1. 数组 在生成数组的时候数…...
6 使用强制类型转换的注意事项
概述 在C语言中,强制类型转换是通过直接转换为特定类型的方式来实现的,类似于下面的代码。 float fNumber = 66.66f; // C语言的强制类型转换 int nData = (int)fNumber; 这种方式可以在任意两个类型间进行转换,太过随意和武断,很容易带来一些难以发现的隐患和问题。C++为…...
Leetcode.939 最小面积矩形
题目链接 Leetcode.939 最小面积矩形 Rating : 1752 题目描述 给定在 xy平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴。 如果没有任何矩形,就返回 0。 示例 1: 输入࿱…...
Springboot项目快速实现过滤器功能
前言很多时候,当你以为掌握了事实真相的时间,如果你能再深入一点,你可能会发现另外一些真相。比如面向切面编程的最佳编程实践是AOP,AOP的主要作用就是可以定义切入点,并在切入点纵向织入一些额外的统一操作࿰…...
基于springboot的简历系统的实现
摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,简历系统当然也不能排除在外。简历系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用…...
Vue3中watch的用法
watch函数用于侦听某个值的变化,当该值发生改变后,触发对应的处理逻辑。 一、watch的基本实例 <template><div><div>{{ count }}</div><button click"changCount">更改count的值</button></div> …...
MS python学习(18)
学习Pandas.DataFrame(2) load csv(comma seperated variable) files to DataFrame and vice versa upload csv files read/write csv files load data into jupyter notebook, create a new folder and then upload the csv files into it. (CSV comma seperated variable)…...
java笔记
前言 以下是一名java初学者在自学过程中所整理的笔记,欢迎大家浏览并留言,若有错误的地方请大家指正。 java语言特性 简单性:相对于其他编程语言而言,java较为简单,例如:java不再支持多继承,C…...
对象的构造及初始化
目录 一、如何初始化对象 二、构造方法 1.概念 2.特性 三、默认初始化 四、就地初始化 总结 一、如何初始化对象 在Java方法内部定义一个局部变量的时候,我们知道必须要进行初始化。 public class Test4 {public static void main(String[] args) {//未初始化…...
Socket 读取数据
1. Socket 配置参数中添加 1.1 读取 Socket 字节时的字节序 1.2 读取数据时,单次读取最大缓存值 1.3 从 Socket 读取数据时,遵从的数据包结构协议 1.4 服务器返回数据的最大值,防止客户端内存溢出 /*** Description: Socket 配置参数*/public…...
小白的Git入门教程(一)
这是本人的git的入门过程仅供参考 先是在官网下载git版本下载链接,安装步骤可以搜索其他大神的文章然后就是创建一个属于你的git本地库首先是创建一个文件夹作为根目录,这里我创建了一个叫test_git文件夹紧接着便进去新建文件夹,点击这里的g…...
第一个Vue程序
第一个Vue程序 <body> <!--view层 变成了一个模板--> <div id"app">{{message}} </div><!--导入vue.js--> <script src"https://cdn.jsdelivr.net/npm/vue2.5.16/dist/vue.min.js"></script> <script>va…...
2023上学期学习计划
目前:根据答辩的情况来看,目前去项目组,着重写好算法是相对较优的打算,先将项目写好,之后着重提升算法水平,这学期主要啃《算法导论》与《大话数据结构》这俩本书,同时刷题量要达到160题 四月份…...
深入了解MySQL锁机制及应用场景
深入了解MySQL锁机制及应用场景锁的概述锁的分类锁的应用场景数据库事务管理多线程程序开发数据库的备份和恢复对于在线游戏等高并发应用场景锁的具体使用方法锁的应用实例总结锁的概述 MySQL锁是操作MySQL数据库时常用的一种机制。MySQL锁可以保证多个用户在同时执行读写操作…...
Java类和对象
目录 一、什么是面向对象? 二、类与对象的基本概念 1.类 2.对象 三、类的定义格式 四、类与对象的定义与使用 1.什么是实例化 2.实例化对象 3.类的使用 4.类与对象的说明 总结 一、什么是面向对象? 面向对象是一种现在最为流行的程序设计方法&a…...
aspnet053+sqlserver在线考试系统xns
目 录 基于.NET的考试系统 1 摘 要 3 前 言 4 第一章 系统概述 5 1.1 本课题的研究意义 5 1.2 本论文的目的及内容 5 第二章 在线考试系统概述 7 2.1 现行在线考试系统现状 7 2.2 电子管理平台的开发方法介绍 8 2.2.1 B/S体系结构 8 2…...
新一代大学英语(提高篇)
词汇题(55道) 1. You should carefully think over_____ the manager said at the meeting. A. that B. which C. what D. whose 1.选C,考察宾语从句连接词,主句谓语动词think over后面缺宾语,后面的宾语从句谓语动…...
阿里云OSS 203 Non-Authoritative Information问题解决
问题描述: 203 Non-Authoritative Information 问题分析: 1、跨域问题,阿里云OSS没有配置跨域规则。 解决办法请参考以下博客。 阿里云OSS No ‘Access-Control-Allow-Origin‘ header is present on the requested resource问题解决_旭东…...
【数据结构】你真的认识“”吗?它真的就只是“取地址”吗?或许你一直都在误解它。
我们有时候在看数据结构相关书籍时,经常会看到这样的写法: void StackInit(ST& ps) {assert(ps);ps.a NULL;ps.top 0;ps.capacity 0; } 注意,这里的&可不是表示取地址。如果你把它理解为取地址,那就在错误的路上狂奔&…...
[深入理解SSD 21] 固态硬盘GC机制 | GC 分类 | GC 过程 | GC 和 Trim 的关系
Hello 大家好, 我是元存储~主页:元存储的博客_CSDN博客-深入理解SSD:固态存储特性与实践,深入浅出SSD:固态存储原理与特性,深入理解Flash:闪存特性与实践领域博主前言SSD上已经被写入过的Page页在重新被写入之前,必须要将page页所在的block块…...
esp-nimble-cpp:ESP32上轻量级BLE C++开发指南
1. 项目概述esp-nimble-cpp是专为 ESP32 平台设计的 C 封装库,其核心目标是为 Apache NimBLE BLE 协议栈提供面向对象、线程安全且资源高效的抽象层。该库并非简单封装,而是以工程实践为导向的深度重构:它在保持与 nkolban 经典cpp_utilsBLE …...
前端进阶 课程二十六、:Flex布局进阶与实战(复杂布局)
一、学习目标 掌握Flex布局嵌套规则,实现容器内多层Flex嵌套; 运用Flex完成头部+内容区+底部、卡片详情、响应式导航三大复杂布局; 解决Flex项目溢出、对齐失效、高度自适应等常见问题; 区分Flex与float布局,明确Flex的现代布局优势。 二、核心知识点+实战代码 1. Fl…...
OpenClaw个性化设置:Qwen3.5-9B模型参数调优实战
OpenClaw个性化设置:Qwen3.5-9B模型参数调优实战 1. 为什么需要调整模型参数? 上周我在用OpenClaw自动处理一批技术文档时,遇到了一个奇怪的现象:同样的任务指令,有时候AI能完美执行,有时候却会输出一堆无…...
Ryzen SDT调试工具:解锁AMD处理器隐藏性能的终极指南
Ryzen SDT调试工具:解锁AMD处理器隐藏性能的终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://git…...
SEO_10个提升网站排名的实用SEO技巧分享(370 )
SEO:10个提升网站排名的实用SEO技巧分享 在当今的互联网时代,一个网站的成功离不开搜索引擎优化(SEO)。SEO不仅仅是一套技术,更是一种思维方式。本文将详细分享十个实用的SEO技巧,帮助你提升网站的排名,吸…...
TP4056充电板实战避坑指南:从LED状态误判到TEMP脚悬空,新手最容易踩的5个坑
TP4056充电板实战避坑指南:从LED状态误判到TEMP脚悬空,新手最容易踩的5个坑 第一次使用TP4056充电板时,我盯着闪烁的LED灯陷入了困惑——为什么充满电后红灯还亮着?为什么电池发热异常?这些问题让我意识到,…...
Java程序员的云原生时代生存指南:面向软件测试从业者的专业视角
在技术浪潮的冲击下,云原生已从概念演进为产业标准。对于广大Java程序员而言,这既是挑战也是机遇。传统的技术栈和开发模式正在经历深刻变革,而软件测试作为保障质量的关键环节,其理念与实践也随之迭代。 一、 挑战审视ÿ…...
SEED数据集之外:脑电情感识别还有哪些开源数据集值得一试?
SEED数据集之外:脑电情感识别领域五大开源数据集深度评测 当我在实验室第一次尝试构建情感识别模型时,和大多数初学者一样,首先接触到的就是SEED数据集。但随着研究的深入,我逐渐发现这个领域远比想象中丰富——不同诱发范式、采集…...
N_m3u8DL-CLI-SimpleG:快速下载M3U8视频的终极指南
N_m3u8DL-CLI-SimpleG:快速下载M3U8视频的终极指南 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG N_m3u8DL-CLI-SimpleG是一个专门用于下载M3U8流媒体视频的开源工具…...
在CentOS上部署RustDesk私有中继服务器:从零搭建到安全配置
1. 环境准备:搭建RustDesk私有中继服务器的基石 在CentOS系统上部署RustDesk私有中继服务器,首先需要确保基础环境配置正确。我遇到过不少因为环境问题导致的部署失败案例,所以这部分我会详细说明每个环节的注意事项。 1.1 系统更新与基础依赖…...
