HashMap的学习感悟

Hashmap 的原理底层其实也是一个数组Entry[n],数组中的每个元素Entry其实就是个链表。

默认容量为16,加载因子为0.75,也就是说当前的元素个数超过>当前容量*加载因子 也就是说 当put当前元素时,

length为13了,就会进行第一次扩容。HashMap的宽容规范是在原先基础上*2去扩容,也就是说它的容量默认只能为

16 16*2 16*4这中规则去扩容,也就是保证了容量为2的n次方。这样扩容的原因跟HashMap的存储原理是息息相关的,HashMap的put操作,是根据

key的HashCode来确定put进来元素的在底层Entry[]数组中的index。

根据key的HashCode方法后得到key的Hash值,得到这个值之后和(容量-1)&操作就得到了新加入对象在数组中的下标,(容量为2的n次方)。也就是说

当容量不为2的n次方时,&操作就会出现一些下标永远不可能出现,比如当容量为15,也就是hashcode&14 14的二进制位 为 1110,也就是说第一位为1的下标永远

都不可能出现,也就是说当容量为15这种数字时,1 11 111,也就是下标为1 3 7 这三个位置永远都不可能存入元素,当容量扩大时,就会有更多的位置存在

永远都不可能放进去元素了。这就是HashMap的容量为什么要保证为2的n次方的原因。

还有一点由于扩容必将导致元素的重新定位,我觉得HashMap最大的性能问题也许就是由扩容导致的。HashMap的查找快,是由于它底层是数组,数组的优势在于

快速查找。数组的劣势在于删除操作的时候会造成数组元素的移动。而HashMap正好结合了数据的查找优势和链表的删除优势,它采用的是数组家链表来实现的。

最后扯一下put操作和get操作。

put往集合里面添加元素,首先会判断容量问题,然后对key hash换算得到index,然后就创建出Entry,紧接着就是讲这个entry加入到数组。找到数组指定位置的

Entry如果为空,则直接加入,如果不为空,则判断该key是否在集合中是否已经存在,如果存在则替换value,否则将当前的Entry加入到该位置链表的表头去,也就是链表的操作了。

Get操作,同样的,根据key找到下标,然后遍历该元素链表,比较key和hash,如果相等,则返回,没找到则返回null.


以上是我对HashMap的一些理解吧,如有错误,欢迎指正。


内容概要:本文系统梳理了多个科研领域的前沿研究与技术实现,重点涵盖FDTD方法中的完美匹配层(PML)研究,以及Matlab/Simulink在电磁、电力、控制、通信、信号处理、图像处理、路径规划、能源系统优化等领域的仿真与算法实现。文中列举了大量基于Matlab和Python的科研案例,如风电功率预测、负荷预测、无人机三维路径规划、电池系统故障诊断、雷达模拟、通信编码、微电网优化调度等,并强调结合智能优化算法(如粒子群、遗传算法、深度学习等)提升系统性能。同时,提供了丰富的代码资源与仿真模型,涵盖永磁同步电机控制、逆变器设计、多智能体任务分配、虚拟电厂调度等复杂系统,助力科研人员快速开展复现实验与创新研究。; 适合人群:具备一定编程基础,熟悉Matlab/Python工具,从事电气工程、自动化、通信、人工智能、新能源、控制科学等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习并实现FDTD仿真中的PML边界条件以有效抑制数值反射;② 掌握Matlab/Simulink在多物理场建模、控制系统设计与优化算法中的综合应用;③ 借助提供的代码资源完成科研复现、课程设计、竞赛项目或工程原型开发; 阅读建议:此资源以科研实战为导向,不仅提供理论方法,更强调代码实现与仿真验证。建议读者结合自身研究方向,按目录顺序查阅相关模块,下载配套代码进行调试与二次开发,以达到学以致用、融会贯通的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值