首页 > 其他分享 >HashMap的底层设计

HashMap的底层设计

时间:2024-03-24 15:33:05浏览次数:24  
标签:黑树 key hash HashMap 链表 数组 设计 节点 底层

底层数据结构

  • 在jdk1.7及它之前是数组+链表;
    在jdk1.8极其之后,是数组+(链表|红黑树)

jdk1.8数组索引计算

 static final int hash(Object key) {
      int h;
      return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
  }

而索引值等于hash值和数组长度减一作与运算的结果。
由此也可以看出,HashMap允许键为空,之所以在计算hash值时,将原始hsahCode值与其右移16
位之后的值做异或操作,是为了综合高位数据,因为当数组长度较短时,利用上述算法计算索引值
原hashCode的高位数据会直接被丢弃,这样当数据低位hashCode类似时,产生hash碰撞的概率会
增大。

链表何时会转化为红黑树

当链表新增元素后长度大于8,并且数组的长度大于等于64时,链表会转化为红黑树。

  • 为什么将链表转化为红黑树的时机选在此时
    • 当数组的长度小于64时,可以通过扩容来缩短链表长度,且此时数组长度并不是很长,所以扩
      容的开销是小于将链表转化为红黑树的开销的。
    • 当链表的长度小于8时,此时链表遍历的开销并不算大,相反,如果在此时将链表转化为红黑树,
      红黑树不仅所占内存空间更大,而且红黑树的维护开销更大;
      当链表的长度大于8时,此时链表遍历的开销更大,应该创建红黑树来提高效率。

红黑树何时会退化为链表

  • 当数组扩容导致红黑树的拆分,树中的节点个数小于等于6时,红黑树会退化为链表。
  • 当对红黑树中的节点进行remove操作时,如果root, root.left, root.right, root.left.left
    为null时,红黑树也会退化为链表。

为什么数组的容量要为2的n次幂

* 当capacity = 2^n时,hash % capacity = hash & (capacity - 1)
* 当数组扩容时,链表会拆分,对于同一个链表中的节点来说,可通过 hash & oldCapacity是否等于零
  拆分为两组,若等于零,则扩容之后索引位置不变,若不为零,则新索引位置等于旧索引位置加上旧的数
  组容量。

数组扩容的负载因子为什么是0.75

  • 若小于0.75则数组可能会频繁扩容,效率下降,空间利用率也会下降,但是链表的长度不会太长
  • 若大于0.75则数组扩容频率下降,空间利用上升,但是链表的长度会变长

HashMap的put方法流程

  1. HashMap的数组是懒创建的,所以如果是第一次调用put会先创建数组;
  2. 计算key的hash值通过hash值得到数组索引,若数组索引处为null则直接new一个新的节点添加。
    否则,比较第一个节点的key和参数中的key是不是同一个key,若不是,判断该节点是TreeNode
    还是普通Node,然后按照对应的红黑树或者链表的方式去遍历进行更新或添加节点.
  3. 若是链表添加节点,则在添加节点后要判断满不满足树化的条件。
  4. 如果是添加了节点,最后要判断需不需要对数组进行扩容。

标签:黑树,key,hash,HashMap,链表,数组,设计,节点,底层
From: https://www.cnblogs.com/ydw333/p/18090572

相关文章

  • 毕业设计3489基于微信小程序的就业管理系统设计与实现【源代码+文档+调试+讲解视频】
    摘要本文旨在介绍一个基于微信小程序的就业管理系统的设计与实现。该系统通过服务器端和客户端两种用户角色,实现了个人用户管理、企业管理、就业指导管理、职位管理以及系统管理等功能。同时,系统提供了用户友好的界面设计和便捷的操作体验,为求职者和企业提供了一个高效、便......
  • 数据结构课程设计,用线性表做一个通讯录管理系统
    求一个注释,帮忙解析以下代码#include<iostream>#include<string>#include<cstdlib>#defineMAX2000usingnamespacestd;//通讯录管理系统//设计联系人结构体structPerson{ stringm_Name; intm_Sex; intm_Age; stringm_Phone; stringm_Addr;};//设计......
  • 牛客--2024中国传媒大学程序设计大赛(同步赛)
    A-小苯的区间和疑惑题意:做法:前缀最大值+后缀最大值 or 线段树维护最大子段和intarr[200005],pre[200005],last[200005];voidsolve(){//小笨的区间和疑惑--前缀最大值+后缀最大值or线段树维护最大自段和intn;cin>>n;for(inti=1;i<=n;i++)cin......
  • c语言程序设计——实验报告二
    实验项目名称:实验报告2数据描述实验项目类型:验证性实验日期:2024年3月21日一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。2、掌握不同数据类型之间赋值的规律。3、学会使用C的有关算术运算符,以及包含这些运算符的......
  • 【附源码】java松江大学城就餐推荐系统设计与实现(ssm毕业设计+maven+vue+计算机专业)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在现代都市的快节奏生活中,餐饮服务已经成为人们日常生活中不可或缺的一部分。尤其是对于大学生这一群体,他们通常生活在学校周边的大学城,拥有丰富的就餐选......
  • objective-c之Class底层结构探索
    isa走位图在讲OC->Class底层类结构之前,先看下下面这张图:通过isa走位图得出的结论是:1,类,父类,元类都包含了isa,superclass2,对象isa指向类对象,类对象的isa指向了元类,元类的isa指向了根元类,根元类isa指向自己3,类的superclass指向父类,父类的superclass指向的根类,根......
  • 智能停车场管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台......
  • 医院预约挂号系统设计与实现|jsp+ Mysql+Java+ Tomcat(可运行源码+数据库+设计文档)
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台......
  • 智能停车场管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台......
  • 沙县小吃点餐系统|基于JSP技术+ Mysql+Java的沙县小吃点餐系统设计与实现(可运行源码+
    推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可运行源代码+设计文档)目录1.前......