HashMap的底层有数组 + 链表(红黑树)组成,数组的大小可以在构造方法时设置,默认大小为16,数组中每一个元素就是一个链表,jdk7之前链表中的元素采用头插法插入元素,jdk8之后采用尾插法插入元素,由于插入的元素越来越多,查找效率就变低了,所以满足某种条件时,链表会转换成红黑树。随着元素的增加,HashMap的数组会频繁扩容,如果构造时不赋予加载因子默认值,那么负载因子默认值为0.75,数组扩容的情况如下:

1:当添加某个元素后,数组的总的添加元素数大于了 数组长度 * 0.75(默认,也可自己设定),数组长度扩容为两倍。(如开始创建HashMap集合后,数组长度为16,临界值为16 * 0.75 = 12,当加入元素后元素个数超过12,数组长度扩容为32,临界值变为24)

2:在没有红黑树的条件下,添加元素后数组中某个链表的长度超过了8,数组会扩容为两倍.(如开始创建HashMAp集合后,假设添加的元素都在一个链表中,当链表中元素为8时,再在链表中添加一个元素,此时若数组中不存在红黑树,则数组会扩容为两倍变成32,假设此时链表元素排列不变,再在该链表中添加一个元素,数组长度再扩容两倍,变为64,假设此时链表元素排列还是不变,则此时链表中存在10个元素,这是HashMap链表元素数存在的最大值,此时,再加入元素,满足了链表树化的两个条件(1:数组长度达到64, 2:该链表长度达到了8),该链表会转换为红黑树

HashMap创建的底层原理

1:首先创建HashMap集合时,在不手动赋值的情况下会先设置默认负载因子0.75

2.向集合值添加元素会调用putVal()方法,前三个参数分别为hash(key),key,value,即hash值,键值对。

3.hash(key)方法计算hash值

计算方法是键的hashCode()方法与高位16进行异或运算得到hash值

4.进入putVal方法,首先看上半部分

首先判断数组中是否已经创建,此时还创建数组,所以此时调用

resize()方法设置初始容量

若未在构造方法时设置初始容量,则初始容量设置为16.(注意容量只能为2的倍数,即使输入的不是2的倍数也会自动转换)

将元素存储在i = (n - 1) & hash的下标链表中,因为此时为加入元素所以table[i]一定是null,元素一定会存入到数组中。

5.接着会跳过之后的判断语句

size代表了此时集合中已经加入的元素个数,当其值大于了临界值
threshold(此时为12)时,会调用resize()方法进行二倍扩容

6.添加完第一个元素后继续添加下一个元素,因为重写了hashCode()方法,让两个元素的hash值相同,所以它们会存储在同一个链表中,进入putVal()方法后,上面的第一个if语句为false,因为已经初始化了数组,第二个if也是false,因为当前链表下的头元素已经存在,它会进入if语句的分支else语句

7.第一个if语句判断链表中头元素与当前插入的元素是否是同一个元素(hash()方法与equals()方法比较)

这里重写了hash()方法所以hash值相同但两种内容不同所以进入else分支,判断当前数组中的结点是链表还是红黑树,如果是红黑树,就按红黑树的添加方式添加。

此时我们还未形成红黑树,所以不会执行,进入else语句。

8.接下来进入一个死循环,死循环结束有两种方式

1.第一种结束方式:链表中没有找到与当前添加元素相同的元素(euqals()方法比较),就会用尾插法在链表末尾插入这个添加的元素,然后会进行if判断,判断添加元素前当前链表中元素是否达到了8,如果达到了,进入

treeifyBin(tab, hash)语句,在该语句中,我们只关注前半部分,在数组容量小于64时,数组会调用
resize()方法扩容为2倍

2.第二种结束方式

还是在for循环中,如果找到了与添加元素相同的元素(euqals()方法比较),直接跳出循环。然后进入if语句,覆盖掉链表中元素的“值”(value),

9.之后更新集合中元素的个数,判断是否超过了临界值,超过了就会扩容为2倍

关于HashMap扩容机制相关推荐

  1. 聊一聊不同技术栈中hashmap扩容机制

    前言 hash简介 作为后端开发,说HashMap是我们最经常接触到的数据结构都不为过,而HashMap如其名最主要依赖的算法就是hash散列算法来存储和读取数据.         以关键码值K为自变 ...

  2. 七、JDK1.7中HashMap扩容机制

    导读 前面文章一.深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二.Jdk1.7和1.8中HashMap数据结构及源码分析 .三.JDK1.7和1.8Hash ...

  3. 必知必会--HashMap扩容机制

    前言 HashMap作为Java中使用最频繁的数据结构之一,它的技术原理与细节在面试中经常会被问到.笔者在面试美团时曾被面试官问到HashMap扩容机制的原理.这个问题倒不难,但是有些细节仍需注意. ...

  4. 八、JDK1.8中HashMap扩容机制

    导读 前面文章一.深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二.Jdk1.7和1.8中HashMap数据结构及源码分析 .三.JDK1.7和1.8Hash ...

  5. Java8 HashMap 扩容机制与线程安全分析

    如果大家有仔细阅读过 HashMap 的源码就会发现 HashMap 的哈希表初始化并不是在其构造函数中进行的,而是 resize() 方法. 这篇文章不对 HashMap 中的树进行介绍. 一.Ha ...

  6. hashmap扩容机制_图文并茂:HashMap经典详解!

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 代码中的注解多看几遍,其中HashMap的扩容机制是要必懂知识!结合图片一起理解! 什么是 HashMap? HashMap 是基于哈希表的 ...

  7. hashmap扩容机制_图文并茂,HashMap经典详解!

    Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 作者:feigeswjtu 来源:https://github.com/feigeswjtu/java-basics ...

  8. HashMap扩容机制

    HashMap的扩容机制 HashMap在容量超过负载因子所定义的容量后,就会扩容,将HashMap的大小扩大为原来的两倍. 判断当前数组是否为空,为空则是初始化操作 如果旧数组长度大于等于最大容量M ...

  9. jdk1.8 HashMap扩容机制变化

    概述 JDK1.8中的HashMap较于前代有了较大的变更,主要变化在于扩容机制的改变.在JDK1.7及之前HashMap在扩容进行数组拷贝的时候采用的是头插法,因此会造成并发情景下形成环状链表造成死 ...

  10. HashMap扩容机制解读

    扩容机制 什么时候需要扩容: 当hashmap中的元素个数超过数组大小 * loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR) ...

最新文章

  1. fatal error C1075: “{”: 未找到匹配令牌
  2. Timus 1204 Idempotents
  3. 不懂编程的产品经理如何不被程序员吊打?
  4. html 完全复制div中的内容_LOL手游现在远非完全体,未来还有哪些端游内容会加入手游中?...
  5. 为什么不能用速度与时间的关系去实现动画
  6. 46 - 算法 -Leetcode-189-旋转数组-数据结构vector或者reverse函数
  7. 数据库练习题总题库选择判断简答操作题
  8. 梅花雨的日历控件在ASP.NET2.0下不可用的解决方法
  9. 查找css,查找CSS样式
  10. Linux修改Mysql默认端口3306
  11. android打开wav声音
  12. 安装基于Ubuntu的微信小程序开发工具
  13. 访问共享服务器的没有权限文件夹权限设置,访问共享文件夹的时候提示没有权限访问网络资源怎么解决...
  14. vue-awsome-swiper稳定版本3.1.3及使用方法,API见swiper官网https://www.swiper.com.cn/api/index.html
  15. 手机厂商为何取消3.5mm耳机孔?主要原因有5点,看完你就知道了
  16. c语言access码大小写A转换,字母大小写互相转换 ASCII码转化符号问题
  17. 开发日志_Jan.9
  18. 客户端socket通信库
  19. Kotlin 集合类的高阶函数
  20. IT产品经理的工作职责

热门文章

  1. 小米10至尊纪念版和华为mate40哪个好
  2. 用python做五子棋游戏_用python来做一个五子棋游戏,源码分享~
  3. [读书笔记]一本书学会人情世故
  4. Liunx系统编程篇—进程通信(五)信号
  5. 字母图形:利用字母可以组成一些美丽的图形,请找出这个图形的规律,并输出一个n行m列的图形。
  6. Xavier安装pytorch
  7. 解决有道云笔记QQ总是授权失败问题
  8. 如何使用爬虫采集58招聘信息
  9. 小米应用使用时间统计_通话时间统计
  10. html 愤怒的小鸟代码,HTML5 CSS3 愤怒的小鸟卡通形象