HashMap学习小结

hashmap学习记录小结

WHAT:

数据结构是数组+链表。

链表存储的是一个entry对象。entry对象存着四个属性(hash,key,value,next)

整体是一个数组;

数组的每一个位置是一个链表;

链表的每个节点中的value是我们存储的对象

HOW:

工作原理

new HashMap;

有参和无参构造。无参构造,容器默认的数组大小initialCapacity是16,加载因子localFactory是0.75。所以这个容器的阈值是initialCapacitylocalFactory = 16 *0.75 =12。

map.put方法:

一:根据HashMap提供的hash算法算出当前key的Hash值。

二:通过计算出的hash值取调用indexFor方法计算当前对象应该存储在数组的几号位置。

三:判断size是否已经到达了当前的阈值,如果没有,就继续。如果已经到达阈值,那么就先进行数组扩容,将数组长度扩容为原来的2倍。

​ size是当前容器已经有对象的数量,而不是数组长度。

四。将当前对应的hash、key、value封装为一个entry。取数组中查找当前位置是否有元素,入伏哦没有就放到这个位置上,如果已经存在了链表。那么遍历链表。如果链表上某个节点的key与当前的key进行equals比较后返回true,返回原来的value。将新的value替换掉原来的value。遍历完链表,没找到的话,也就是没有找到相同key的节点的话,将封装的新的entry中的next指向当前链表的始节点节点,也就是说当前节点在链表的第一个文职,简单说就是先来的往后退。

扩容机制:

HashMap使用的是懒扩容,只有在put操作的时候才会进行判断,进行扩容。

1、数组长度扩容为原来的2倍

2、将原来数组的元素赋值到新数组中

扩容之后,都需要重新计算entry在新数组中的位置,因为算出位置的indexFor方法,彩英的是&(与)运算。

private static int indexFor(int h, int length) {
    return h & (length-1);
}

那么HashMap为什么会使用这种计算方式在数组中计算位置呢。

与运算可以提升性能。

与运算用length-1的原因是因为,hashmap初始化的时候,数组长度必须是2的整次幂。哪怕自定义的数组长度参数是奇数,也会转化为距离n最近的2的整次幂数

只有这样

h& length-1 和h%length的结果是一样的。当length是2的整次幂的时候,length-1的结果是低位全是1,为后面的扩容做了很好的准备。

与运算

	1 0 0 0    // 8的二进制数
&   0 1 1 0    // 6的二进制数
___________    // 运算规则:该位置上有一个是0 结果就是0
    0 0 0 0    // 二进制数计算结果

HashMap和HashTable的区别

1、存储结构和解决冲突都一致

2、hashtable默认容量是11,hashmap是16 ,hashtable不要求底层的数组容量是2的整次幂。hashmap一定要求

3、HashTable 的key和value都不允许为null,

hashmap的key和value都可以为null。key只能有一个,value可以有多个null

4、hashtable扩容,容量变为原来的2倍+1,hashMap容量变为2倍。

5、hashtable计算hash值,直接用key的hashcode。计算位置索引用的%,hashmap使用的是&与运算。

hashmap的优化方式

初始化hashmap时,可以对负载因子和初始容量进行设置。

当元素个数大于新的阈值时,在进行扩容。当loadFactory加载因子过大时,map的数组使用效率高了,内部形成了entry链。影响查找速度。

loadFactory负载因子过小时,map的数组使用率变低了,提高查找速度。但是内存占用上去了。

合理的初始化HashMap

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值