【夯实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 判断链表的长度


目录
相关文章
|
7月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
504 7
|
7月前
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
7月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
272 5
|
2月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
7月前
|
存储 Java
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
前言 下面,跟上主播的节奏,马上开始ThreadLocal源码的阅读( ̄▽ ̄)" 内部结构 如下图所示,我们可以知道,每个线程,都有自己的threadLocals字段,指向ThreadLocalMap
516 81
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
|
7月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
486 70
|
6月前
|
JavaScript Java 关系型数据库
家政系统源码,java版本
这是一款基于SpringBoot后端框架、MySQL数据库及Uniapp移动端开发的家政预约上门服务系统。
214 6
家政系统源码,java版本
|
6月前
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
405 23
|
5月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
295 3
|
7月前
|
Java
【源码】【Java并发】【ReentrantLock】适合中学者体质的ReentrantLock源码阅读
因为本文说的是ReentrantLock源码,因此会默认,大家对AQS有基本的了解(比如同步队列、条件队列大概> 长啥样?)。 不懂AQS的小朋友们,你们好呀!也欢迎先看看这篇
168 13
【源码】【Java并发】【ReentrantLock】适合中学者体质的ReentrantLock源码阅读
下一篇
oss云网关配置