HashMap的底层实现(1.8前后的区别)

本文介绍了HashMap在JDK1.8前后的底层实现差异。在1.8之前,它使用数组和链表结合,通过扰动函数处理hashCode并使用拉链法解决冲突。1.8之后,当链表长度超过8时,HashMap会将链表转换为红黑树以提高搜索效率。此外,讨论了HashMap长度选择2的幂次方的原因,以确保更均匀的数据分布并减少碰撞。

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

JDK1.8之前

JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。

所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的
hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞
所谓 “拉链法” 就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希
冲突,则将冲突的值加到链表中即可。
在这里插入图片描述

JDK1.8之后

相比于之前的版本, JDK1.8之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
在这里插入图片描述

《Java 8系列之重新认识HashMap》 :

HashMap底层实现原理1.8版本主要涉及到哈希算法、数组和链表/红黑树的数据结构以及扩容机制。首先,hashcode()方法会根据对象的特定规则生成一个哈希码,用于确定对象在数组中的存储位置。如果两个对象的equals()方法返回true,则它们的哈希码必须相等。 HashMap内部使用一个Entry数组来存储键值对,数组的每个位置称为桶。每个Entry对象包含键值对的信息,以及一个指向下一个Entry的指针。当向HashMap中添加键值对时,根据键的哈希码找到对应的桶,如果该桶为空,则直接将键值对存入该桶;如果不为空,则遍历链表(或者当链表长度达到一定阈值时,将链表转换为红黑树),找到合适的位置插入新的键值对。 在1.8版本中,当链表长度超过8,则将链表转换为红黑树,这是为了提高查询效率。红黑树的查询时间复杂度为O(logN),相比链表的O(N)更低。当红黑树节点数量小于6时,又会将红黑树转换回链表,以节省内存。 HashMap还有一个重要的机制是扩容。当哈希表的大小超过了负载因子与桶的数量的乘积时,就会自动触发扩容操作。扩容会创建一个更大的数组,并将所有的键值对重新分配到新数组的桶中,这个过程是比较耗时的。扩容的目的是为了减少哈希冲突,提高查询性能。 总的来说,HashMap底层实现原理1.8版本主要依靠哈希算法、数组和链表/红黑树的数据结构以及扩容机制来实现高效的键值对存储和检索。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [1.8版本HashMap底层原理分析](https://blog.csdn.net/m0_61750910/article/details/123204007)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值