【夯实Java基础】(五)轻松掌握 HashMap 源码

简介: 【夯实Java基础】(五)轻松掌握 HashMap 源码

文章目录


引子

图解 HashMap 的数据结构

详细分析 HashMap 源码的代码


引子


计算机中如果存储数据的话,我们该怎么办?

数据在计算机中存储的一个方式/结构(数据结构)

如果我们对 HashMap 底层的数据结构都搞清楚,那应该能有助于我们看懂源码。


数据结构?? 数组、链表、树形、图形


20191205144639112.png


图解 HashMap 的数据结构


Key,value---------------------> HashMap 的数据结构应该比较吊

我们可以大胆的猜测 HashMap 应该是将 数组和链表的优势结合起来

数组+链表的形式 -----------> HashMap 的数据结构 jdk1.8 红黑树


20191205150939986.png


紫色部分即代表哈希表本身(其实是一个数组),数组的每个元素都是一个单链表的头节点,链表是用来解决hash地址冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中保存。


详细分析 HashMap 源码的代码


数组的表示:Node table[]


20191205151753799.png


默认初始容量为16


20191205151941173.png


20191205152121843.png


数组的大小可能会不够用 扩大


问题是? 什么时候进行扩大? 数组16已经用到16的时候再扩大呗?


从感性层面和理性层面来看,我们可以看到 16*0.75=12 数组扩大的一个标准


Java是面向对象的,从上图的双向链表来看,我们可以猜测用代码实现双向链表大概如下:

class Node{
    Object data;
    Node prev;
    Node next;
  }


这在LinkedList源码中得到验证。


20191205145456794.png


链表的长度不能无限大,怎么叫做一个上限?

链表和红黑树之间的转变----------> 相对适合它们各自效率的一个节点


20191205153103285.png


20191205153223509.png


记录一下数组使用格子的数量


size=0 size++


20191205153454242.png


来了一个 key,value 组成了 Node 节点后, 这个节点到底该何去何从?


数组的大小 16

Random.next(16) 0-15

如果落点的算法仅仅是这样的话,就未免太low了

数组的 16 个位置要充分利用其中的 12 个


----------------------------->


生成出一个算法 hash 算法

(1) Int

Key,value -----------------------> key Object ------------------>key.hashCode()

32434535(一个哈希值) hash


(2) 0-15 数组的大小范围

Hash%16 0-15


(3) 尽可能充分利用数组的每一个位置


20191205164232671.png


到了这里,我对 Node 节点的属性都已了然于心。


继续看源码,数组先进行了初始化:

Node[] table = new Node[16];

Resize() 功能 是可以对数组进行初始化操作


20191205164755411.png


把数组的默认大小 和 16*0.75


20191205164936673.png


threshold = 12


20191205165059326.png


(1) 数组原本的位置为空

(2) 数组原本的位置不为空,且下面是链表结构


20191205184014869.png


(3) 数组原本的位置不为空,且下面是红黑树结构


20191205173701919.png


n-1{15} & hash <------------------------ > hash % n{16} 0-15


20191205183055274.png


Key.hashCode() 高16位和16位进行异或运算,这样结果才能尽可能不同


20191205183240834.png


20191205153454242 (1).png


Resize() 数组的初始化操作 数组的扩容的操作


20191205185226386.png


Double 2 倍 为什么是两倍进行扩大数组呢??


20191205190854523.png


16 ------> 32

12 ------> 24


20191205191515940.png


为什么下面还要有代码呢??


因为节点不要总是赖在原来的数组中,也要往新的数组中移动。(重新散列)


老数组进行判断,如果下面是空,进行重新hash 得到一个新的位置


20191205191757161.png


如果为0,保持在原来的位置不动

如果不为0,加上原来的capacity

Hash n-1


1.8 中实现了

TreeNode Parent left right

Treelfy_Threshold 8 超过了这个8 链表----红黑树

Put 判断链表的长度


目录
相关文章
|
1天前
|
存储 Java
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
|
1天前
|
数据采集 监控 安全
java数字工厂MES系统全套源码Java+idea+springboot专业为企业提供智能制造MES解决方案
"MES" 指的是制造执行系统(Manufacturing Execution System)。MES在制造业中扮演着至关重要的角色,它是位于企业资源计划(ERP)系统和车间控制系统之间的系统,用于实时收集、管理、分析和报告与制造过程相关的数据。
8 0
|
1天前
|
移动开发 监控 供应链
JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(app、小程序、H5、台后管理端)
一开始接触MES系统,很多人会和博主一样,对MES细节的应用不了解,这样很正常,因为MES系统相对于其他系统来讲应用比较多!
14 1
JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(app、小程序、H5、台后管理端)
|
1天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
2天前
|
存储 运维 Java
java云his系统源码一站式诊所SaaS系统Java版云HIS系统 八大特点
HIS系统采用面向技术架构的分析与设计方法,应用多层次应用体系架构设计,运用基于构件技术的系统搭建模式与基于组件模式的系统内核结构。通过建立统一接口标准,实现数据交换和集成共享,通过统一身份认证和授权控制,实现业务集成、界面集成。
28 1
|
3天前
|
Java 关系型数据库 MySQL
java+B/S架构医院绩效考核管理系统源码 医院绩效管理系统4大特点
医院绩效考核管理系统,采用多维度综合绩效考核的形式,针对院内实际情况分别对工作量、KPI指标、科研、教学、管理等进行全面考核。医院可结合实际需求,对考核方案中各维度进行灵活配置,对各维度的权重、衡量标准、数据统计方式进行自定义维护。
11 0
|
3天前
|
Java 数据挖掘 BI
Java医院绩效考核系统源码B/S+avue+MySQL助力医院实现精细化管理
医院绩效考核系统目标是实现对科室、病区财务指标、客户指标、流程指标、成长指标的全面考核、分析,并与奖金分配、学科建设水平评价挂钩。
30 0
|
3天前
|
数据采集 前端开发 Java
Java医院绩效考核系统源码maven+Visual Studio Code一体化人力资源saas平台系统源码
医院绩效解决方案包括医院绩效管理(BSC)、综合奖金核算(RBRVS),涵盖从绩效方案的咨询与定制、数据采集、绩效考核及反馈、绩效奖金核算到科到组、分配到员工个人全流程绩效管理;将医院、科室、医护人员利益绑定;全面激活人才活力;兼顾质量和效益、长期与短期利益;助力医院降本增效,持续改善、优化收入、成本结构。
17 0
|
3天前
|
存储 安全 Java
Java一分钟之-Map接口与HashMap详解
【5月更文挑战第10天】Java集合框架中的`Map`接口用于存储唯一键值对,而`HashMap`是其快速实现,基于哈希表支持高效查找、添加和删除。本文介绍了`Map`的核心方法,如`put`、`get`和`remove`,以及`HashMap`的特性:快速访问、无序和非线程安全。讨论了键的唯一性、`equals()`和`hashCode()`的正确实现以及线程安全问题。通过示例展示了基本操作和自定义键的使用,强调理解这些概念对编写健壮代码的重要性。
10 0
|
3天前
|
监控 前端开发 Java
Java基于B/S医院绩效考核管理平台系统源码 医院智慧绩效管理系统源码
医院绩效考核系统是一个关键的管理工具,旨在评估和优化医院内部各部门、科室和员工的绩效。一个有效的绩效考核系统不仅能帮助医院实现其战略目标,还能提升医疗服务质量,增强患者满意度,并促进员工的专业成长
19 0