关于HashMap扩容机制

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

大家好,又见面了,我是你们的朋友全栈君。

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

关于HashMap扩容机制


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

关于HashMap扩容机制

关于HashMap扩容机制

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

 计算方法是键的hashCode()方法与高位16进行异或运算得到hash值关于HashMap扩容机制

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

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

resize()方法设置初始容量

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

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

关于HashMap扩容机制

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

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

关于HashMap扩容机制

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

关于HashMap扩容机制

关于HashMap扩容机制

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

关于HashMap扩容机制

 

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

关于HashMap扩容机制此时我们还未形成红黑树,所以不会执行,进入else语句。

关于HashMap扩容机制

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

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

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

关于HashMap扩容机制

 

关于HashMap扩容机制

 2.第二种结束方式

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

 关于HashMap扩容机制

 

关于HashMap扩容机制

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

 

 关于HashMap扩容机制

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148972.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++ listnode 赋值_C++之ListNode[通俗易懂]

    单链表,弄清楚可stl中list的区别。ListNode的结构structListNode{intval;//当前结点的值ListNode*next;//指向下一个结点的指针ListNode(intx):val(x),next(NULL){}//初始化当前结点值为x,指针为空};如何向ListNode中插入新的结点:从键盘输入ListNode*temp1=new…

    2022年4月18日
    137
  • PLC编程从入门到精通视频教程【副业学习会】

    PLC编程从入门到精通视频教程【副业学习会】PLC编程视频教程共73课,从入门到精通。从基础讲起,一步步提高PLC编程技巧。本套教程分为:电工基础教程、PLC入门教程、PLC高级教程、PLC经验与技巧、触摸屏(人机)编程教学。此视频通俗易懂,而且很实用。![在这里插入图片描述](https://img-blog.csdnimg.cn/20210715203622364.png)课程目录:第1章电工基础教程01电工基础的简介.mp402工厂用电.mp403看懂基本电路.mp404自锁、正反转电路.m…

    2025年9月5日
    7
  • PyCharm 2021.10.3 激活码(JetBrains全家桶)[通俗易懂]

    (PyCharm 2021.10.3 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
    57
  • mac pycharm安装设置_入门python,这样操作,简单易学(安装教程)「建议收藏」

    mac pycharm安装设置_入门python,这样操作,简单易学(安装教程)「建议收藏」首次接触python,感觉比PHP更加实用,适用性更佳广泛。不局限于网站建设,搭建服务器。选择性更佳广。接下来告诉新手宝宝们,怎么在mac和window上安装python软件Pycharm一、Pycharm安装教程:Pycharm官网下载地址:https://www.jetbrains.com/pycharm/1、点击官网地址下载—如图所示,点击下面2,选择你电脑对应的系统下载。window电脑就…

    2022年8月28日
    5
  • 数据挖掘十大算法——简介

    数据挖掘十大算法——简介1.简介ICDM(国际数据挖掘大会)2006年从18种提名的数据挖掘算法中投票选出了十大算法。这18中提名数据挖掘算法分属10大数据挖掘主题,红色部分即为最终选出的十大算法: 分类(Classification) C4.5 CART KNearestNeighbours NaiveBayes 统计学习(StatisticalLearning) SV…

    2022年6月10日
    33
  • jenkins自动触发构建_秒级定时触发器

    jenkins自动触发构建_秒级定时触发器前言跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。jenkins的定时任务是用的crontab语法定时构建语法

    2022年7月29日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号