面试准备HashMap

本文深入解析了HashMap的数据结构,包括其线程不安全性、允许null值null键的特点,以及由数组+链表构成的存储原理。详细阐述了HashMap如何通过hashCode()计算关键字的哈希值,并利用链表解决哈希冲突,介绍了put()和get()方法的工作流程,以及时间复杂度分析。

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

HashMap

线程不安全,允许null 值null 键  ,由数组+链表构成

存储原理

有一个数组存储元素,通过hashCode() 来获得关键字的哈希值(实际上是数组的下标)

数组元素:Entry 类型3个数据域(key,value,next)。

存储过程

第一个键值对A进来,通过hashCode()计算其key的hash得到index=0,那么Entry[0]=A, 第二个键值对B的index也等于0,那么B.next=A,Entry[0]=B;如果第三个键值对C的index=0,那么C.next=B,Entry[0]=C 。(使用链表解决哈希冲突)

存 put()

put() ,先hashCode()  计算出在数组中的位置,如果该位置没有Entry 则直接添加进数组,如果有(发生哈希冲突),则先连接上该链表,然后将该Entry 存储上。

取 get()

先hashCode() 计算位置,然后位置没有,则不能取到,否则有一个为取到,有多个即链表,则用equals() 来与关键字比较找出指定项。

HashMap 存的时间复杂度为O(1) ,hashCode() 计算,存到数组,顶多拉一次链接。

取时间复杂度最好为O(1) 没有链表,直接找到,最差为O(n) ,因为要找的值可能在因为哈希冲突而形成的链表里,有可能需要遍历链表,所以最差为O(n) 。

那么HashMap 是如何计算下标的呢

先对key 的hashCode 进行hash 操作,

先将key.hashCode() 的高16 位与低16 位,做了一个异或。

然后进行下标计算,

(n - 1) & hash

扩容

当超过 (当前容量 * 负载因子)时,会进行扩容,扩充为原来的2 倍。

元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。

内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值