面试部分难点梳理 - HashMap + CurrentHashMap

本文深入探讨了HashMap的继承体系、核心属性、putVal()和resize()方法,详细解析了HashMap的插入、扩容过程。同时,分析了ConcurrentHashMap在JDK1.7和1.8中的实现,包括构造函数、put()操作、扩容机制和安全性。文章旨在帮助理解这两种数据结构的内部工作原理及其在并发环境下的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HashMap

视频
在这里插入图片描述

HashMap的继承体系

在这里插入图片描述

核心属性+构造方法

状态属性:

  • DEFAULT_INITIAL_CAPACITY = 1 << 4; == 16 默认的初始长度
  • MAXIMUN_CAPACITY = 1 << 30; Hash表的最大长度,其是由JVM决定的
  • DEFAULT_LOAD_FACTORY = 0.75f ; 默认的负载因子大小
  • TREEIFY_THRESHOLD = 8; 树化的最小链长
  • UNTREEIFY_THRESHOLD = 6 ;树降级为链的链长
  • MIN_TREEIFY_CAPACITY = 64 ; 链表转化为树时,数组的最小长度。

成员属性

  • Node继承了Map.entry类,
  • Node<K,V>[] table; Hash表的数组
  • size; Hash表的长度
  • modCount; 记录Hash表的修改次数,包括插入、删除等(替换不会计数)。
  • loadFactory ;负载因子
  • threshold ; 扩容阈值(开始时,其数值为tableSizeFor(initCapacity)),但是由于延迟初始化,其并没有真的在内存中分配空间,在后面初始化以后就会变成capacity*loadFactory。
  • 在这里插入图片描述
  • tableSizeFor()函数的目的就是把自定义输入的数值转化成最小的2的n次幂,通过对initCapacity-1 ,不断(对右移1,2,4,8,16位)进行位与操作,得到2的n次幂。
  • 必须是initCapacity,否则在8、16、32等输入2的n次幂的情况下会扩大2倍,变成16、32、64,而不是8、16、32。

putVal()方法

  • putVal一共分为4种情况。

Hash扰动处理

  • 将Hash的高16位与低16位进行异或处理,得到扰动后的Hash数值
  • 扰动后的Hash数值(hash),再将其和(n-1)进行位与操作,得到散列表中的index,在2进制环境下也就是对hash进行取模操作。
  • 在这里插入图片描述

延迟初始化,

  • 如果table为空或者,table的长度为0,这时才初始化数组,以节省内存开销。
    在这里插入图片描述
  • 在这里插入图片描述

第一种情况:Hash数组中没有元素

  • 在这里插入图片描述
  • 找到数组的指定索引位置,插入新节点
  • 这时会跳出判断,++modCount,

第二种情况:Hash数组中有元素并正是我们要找的

  • 在这里插入图片描述
  • 在这里插入图片描述
  • e表示找到了一个我们要找的相同的节点。
  • 更改成为新值,同时返回旧值。

第三种情况:Hash数组中有元素,不是我们要找的找到,并且其数据结构是红黑树

  • 在这里插入图片描述
  • 判断数组中的第一个节点是否是红黑树,如果是,则执行红黑树的插入操作。返回e。
  • 在这里插入图片描述
  • 如果e不为空,则表示原来有值,修改成为新值,返回旧值。

第四种情况:Hash数组中有元素,不是我们要找的找到,并且其数据结构是链表

  • 链表也有三种情况,
    1. 遍历当前链表,找到节点
      在这里插入图片描述
    2. 遍历当前链表,没有找到节点,但是也没有超过树化阈值

    这里用binCount来记录遍历次数,因为遍历是从0开始的,所以当binCount>=TREEIFY_THRESHOLD-1就可以了认为是可以树化了。
    在这里插入图片描述

    1. 遍历当前链表,没有找到节点,达到树化阈值(见
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值