【数据结构】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,第一时间获取新鲜的知识。

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

相关推荐
弈风千秋万古愁4 分钟前
【PID】连续PID和数字PID chapter1(补充) 学习笔记
笔记·学习·算法·matlab
天选之女wow10 分钟前
【代码随想录算法训练营——Day52】图论——101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
算法·深度优先·图论
碧海银沙音频科技研究院18 分钟前
i2s封装成自己定义8路音频数据发送方法
arm开发·人工智能·深度学习·算法·音视频
做科研的周师兄21 分钟前
【机器学习入门】9.2:感知机的工作原理 —— 从模型结构到实战分类
人工智能·算法·机器学习·分类·数据挖掘
不去幼儿园1 小时前
【启发式算法】狼群算法(Wolf Pack Algorithm, WPA)算法详细介绍(Python)
python·算法·启发式算法·任务分配·集群智能
Yupureki1 小时前
从零开始的C++学习生活 18:C语言复习课(期末速通)
c语言·数据结构·c++·学习·visual studio
墨染点香1 小时前
LeetCode 刷题【139. 单词拆分】
算法·leetcode·职场和发展
小兔崽子去哪了1 小时前
数据结构和算法(Python)
数据结构·python
夜晚中的人海3 小时前
【C++】位运算算法习题
开发语言·c++·算法
superior tigre3 小时前
(huawei)5.最长回文子串
c++·算法