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的一些理解吧,如有错误,欢迎指正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值