HashMap源码解析-底层数据结构、原理、扩容机制

本文详细解析HashMap的底层数据结构,包括JDK1.7及1.8的区别。通过深入理解HashMap的实现原理,如如何根据hash值确定数组位置、为何使用右移和异或运算、为什么桶节点超过8转为红黑树等。此外,文章还探讨了HashMap的put方法流程、数组大小选择2的幂次方的原因,以及对null元素的支持。
摘要由CSDN通过智能技术生成

HashMap源码解析-底层数据结构、原理、扩容机制

底层数据结构

  1. 在JDK1.7之前HashMap是由数组+链表构成的
  2. 在JDK1.8之后HashMap则由数组+链表+红黑树构成
    在这里插入图片描述

实现原理

HashMap在put元素的时候,

  1. 会先计算key的hash值,根据hash值确定在数组中的位置。
  2. 如果key的hash值相同的话,
    1. 则会判断key是否equals,如果相等则替换
    2. 如果不相等,则存在这个数组元素的链表中(桶)
  3. 如果桶的节点超过8个,链表会转为红黑树,已提高查找效率。时间复杂度从O(n)变为O(logn)

根据hash值怎么确定数组中的位置

"hello".hashcode()
// 输出99162322
  1. HashMap初始化数组大小为16
  2. 要确定hash值落在数组索引中,可以采用取余的办法
  3. 而是采用与操作(相当于取余,速度要更快)
 if ((p = tab[i = (n - 1) & hash]) == null)
     tab[i] = newNode
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值