HashMap 的实现原理

本文详细解析HashMap的内部工作机制,包括哈希计算、冲突解决、扩容策略等。HashMap采用数组加链表/红黑树的方式存储数据,初始容量为16,加载因子为0.75。当链表长度超过8或红黑树节点数少于6时,会进行数据结构转换。在JDK1.8后,HashMap的优化体现在动态调整数据结构以提高查找效率。
摘要由CSDN通过智能技术生成

HashMap

HashMap基于hashing原理,我们通过put()和get()方法存储和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到bucket位置来存储值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。

HashMap中默认的初始容量为16,默认的加载因子为0.75

  • 初始容量代表了哈希表中桶的初始数量,即 Entry< K,V>[] table 数组的初始长度
  • 加载因子是哈希表在其容量自动增加之前可以达到多满的一种饱和度百分比,其衡量了一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。
  • 比如加载因子是0.75,当数组的使用的长度超过该数组长度*0.75的时候,该数组便会自动扩容。table在HashMap扩容的时候,长度会翻倍

所有的数据都是通过一个Node节点进行封装,其中Node节点中封装了hash值,key,value,和next指针。hash是通过key计算出的hashCode值进行对数组容量减一求余得到的(官方的求余方式是通过&运算进行的)。不同的key计算出来的hash值可能相同,解决冲突是通过拉链法(链表和红黑树)进行处理。正是因为这种存储形势,所以HashMap的存取顺序是无序的。

在JDK1.8之后,HashMap底层是由“数组+链表+红黑树”组成
当要存储一个键值对时,就会先计算键的哈希值(hashCode),然后对其进行取余操作。比如这个数组的长度为16,某个键的哈希值为17,那么17%16=1,所以这个键值对应该存在数组下标为1的位置。那有一个问题,假如某个键的哈希值的33,33%16也是等于1的,那这样子该怎么存呢。其实数组中的每个元素都是一个链表,也就是数组的某个位置可以存放多个值。当链表中的数据量大于8时,链表就会自动转换成红黑树,当红黑树中的数据量小于6时,红黑树又会自动转换成链表。如下图:
在这里插入图片描述
HashMap的具体实现步骤如下:

1、通过调用put(K key, V value), 利用hash(key)计算哈希值(存储位置)。
2、判断Node数组table是否为null或等于0

  • 如果是,调用resize()方法对数组进行扩容。
  • 如果不是,判断table[i]是否已经有元素。
    1)没有元素。new Node直接插入
    2)有元素。判断传入的key是否存在。
    a、若存在,则用新值覆盖旧值。
    b、不存在,判断table[i]是否为treeNode(红黑树节点)
    - a)是,红黑树直接插入。
    - b)不是,遍历链表,判断长度是否大于等于8
    - 是,转为红黑树插入
    - 不是,转为链表插入。key存在则覆盖value。

在这里插入图片描述

HashMap是基于hashing的原理实现的。当我们使用put(key, value)方法将对象存储到HashMap中时,首先会对键调用hashCode()方法,计算并返回的hashCode用于找到Map数组的bucket位置来存储Node对象。HashMap使用数组和链表的数据结构,即散列桶,来存储键值对映射。HashMap的工作原理是通过计算键的hashCode来确定存储位置,并使用链表解决哈希冲突。当多个键具有相同的hashCode时,它们会被存储在同一个bucket中的链表中。当我们使用get(key)方法从HashMap中获取对象时,会根据键的hashCode找到对应的bucket,然后遍历链表找到对应的值对象。HashMap的实现基于一个线性数组,即Entry\[\],其中保存了键值对的信息。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [javaHashMap原理](https://blog.csdn.net/songhuanfeng/article/details/93905015)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [HashMap实现原理分析](https://blog.csdn.net/vking_wang/article/details/14166593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值