【数据结构】 HashMap源码分析(常量+构造方法+方法)

本文详细剖析了HashMap的构造方法,包括无参和有参情况,以及put操作中的内存管理、数组大小调整、树化和链表处理。特别关注了容量计算和节点插入/删除时的策略。
摘要由CSDN通过智能技术生成


HashMap源码分析

一、成员常量

在这里插入图片描述

二、构造方法

在这里插入图片描述

  • 通过构造器可以传指定的容量大小和指定的负载因子
  • 只有一个参数的构造方法,相当于拿指定的容量大小和默认的负载因子,调用两个参数的构造方法

在这里插入图片描述

  • 对应它的无参构造方法,默认没有分配大小,只给了默认的负载因子

三、方法

1.put

在这里插入图片描述

  • 拿到key后,先通过hash方法,得到一个更均匀的异或值,然后进入putVal方法

在这里插入图片描述

1.此时假定为进行了无参构造,没有分配内存
  • 当table没有分配内存时,为null,进入if语句,执行resize()方法

在这里插入图片描述

在这里插入图片描述

  • 无参构造的HashMap对象,在第一次put时,数组大小分配为默认容量16
  • 而当table不为空的时候,进行hash值的计算

在这里插入图片描述

  • HashMap一般会保证,数组的容量是2的某个次幂

在这里插入图片描述

  • 当p==null时,该位置第一次插入结点,直接进行插入
  • 否则,遍历链表进行尾插法
  • 尾插之后,判断结点个数是否>=7,进入treeifyBin方法进行判断是否进行树化

在这里插入图片描述

  • 当数组大小超过64,并且结点超过7时,树化链表,变成红黑树

同理:在删除结点的时候,如果不符合树化条件,会进行解树化,重新变成链表

在这里插入图片描述

2.当发生有参构造时,完成对容量的大小判断后,将容量大小,传进tableSizeFor方法中:

会得到一个接近2次幂的数

在这里插入图片描述

点击移步博客主页,欢迎光临~

偷cyk的图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值