HashMap相关

本文深入解析HashMap的底层实现原理,探讨其使用链表和红黑树的原因,以及在何时进行转换。同时,文章对比了HashSet与HashMap的区别,并分析了HashMap在不同情况下的性能表现。

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

HashMap底层实现原理及面试问题
HashMap底层实现原理哈希表可以说就是数组链表,底层还是数组但是这个数组每一项就是一个链表。

HashSet和HashMap有什么区别?

HashSet底层是采用HashMap实现的。HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。,HashSet的add()方法是根据map的put返回值来判断添加元素是否成功的(也就是靠重写hashcode()和equals())。
在这里插入图片描述

HashMap为是什么要用链表和红黑树实现?在什么时候进行转化?

深入理解HashMap 的工作原理及代码实现,什么时候用到红黑树
HashMap由数组+链表组成的数组是HashMap的主体链表则是主要为了解决哈希冲突而存在的,HashMap 使用拉链法(哈希函数)来解决hash冲突,同一个链表中存放哈希值相同的 Entry,链表的插入是以头插法方式进行的;HashMap 使用第 0 个桶存放键为 null 的键值对

如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

当发生哈希冲突并且size大于阈值的时候,需要进行数组扩容,扩容时,需要新建一个长度为之前数组2倍新数组,然后将当前的Entry数组中的元素全部传输(复制)过去,扩容后的新数组长度为之前的2倍,所以扩容相对来说是个耗资源的操作。
在这里插入图片描述

hash冲突怎么处理?

HashMap在什么情况下复杂度最高,最高为多少?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值