【数据结构】HashMap源码 —— 简单介绍

HashMap源码介绍

下面并非完整的源码,主要简单了解其流程。

1. 基本成员变量

  • 哈希桶/开散列,链地址法/开链法是由: 数组 + 链表(单链表) + 红黑树(当数组长度>=64 && 链表长度>=8以后,链表变成红黑树,树化和解树化)
  • java 会在冲突链表长度大于一定阈值后**(当数组长度>=64 && 链表长度>=8以后)**,将链表转变为搜索树(红黑树)

2. 构造方法

  • 当调用不带参数的构造方法时,默认是没有分配数组大小的。但第一次put的时候,数组大小分配为了默认的16。(put流程中有讲到)
  • 当调用带一个参数的构造方法时,其实内部调用了带两个参数的构造方法。

带有两个参数的构造方法:

实现Map接口的整体集合给到HashMap,来进行构造map(用的比较少)

3. put方法的流程

前提:调用的是不带参数的构造方法

第一次put的流程:

  1. 先计算哈希值,计算哈希值的时候,右移和异或(^),是为了得到更均匀的数字。
  2. 判断数组是否为空,为空数组大小分配为默认的16。
  3. 计算在数组中的位置,判断该位置是否为空,为空 **直接插入。**不为空走下面介绍的代码。

注意:

  • 这里计算数组位置下标的方式 (n-1)&hash 是 等价于 key%len 。前提是n必须是2 的次幂
  • HashMap一般会保证数组的容量是 2的某个次幂

计算的数组位置不为空:

  1. 先判断是否为红黑树,是,按照红黑树的方式插入;不是走下一步
  2. 在该位置进行尾插,每次尾插后判断该链表是否要树化操作。

4. get方法的流程

  • get方法流程与put方法流程类似,可自行查看源码。
  • 注意:get方法,存在解树化操作

好啦Y(^o^)Y,本节内容到此就结束了。下一篇内容一定会火速更新!!!

后续还会持续更新数据结构与算法方面的内容,还请大家多多关注本up,第一时间获取新鲜的知识。

如果觉得文章不错,别忘了一键三连哟!

相关推荐
GIS小天12 分钟前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票
jingling55515 分钟前
面试版-前端开发核心知识
开发语言·前端·javascript·vue.js·面试·前端框架
莫空000021 分钟前
深入理解JavaScript属性描述符:从数据属性到存取器属性
前端·面试
满分观察网友z30 分钟前
开发者的“右”眼:一个树问题如何拯救我的UI设计(199. 二叉树的右视图)
算法
wuxinyan1232 小时前
Java面试题033:一文深入了解MySQL(5)
java·数据库·mysql·面试
森焱森2 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天2 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
呆瑜nuage2 小时前
数据结构——堆
数据结构
笑衬人心。2 小时前
HTTPS详解:原理 + 加解密过程 + 面试问答
java·网络协议·http·面试·https
蓝澈11212 小时前
弗洛伊德(Floyd)算法-各个顶点之间的最短路径问题
java·数据结构·动态规划