关于HashMap

1、什么是HashMap?

HashMap是Map的一个实现类,因采用了hash运算而得名为hashMap。

2、为什么HashMap使用很多?

a、在于Hash,基于Hash散列可以能在一定范围内和地址做唯一映射,而相对而言,Hash运算的性能效率很高,就能很快的定位到对应的Value。

b、对于集合来说,数组比较难插入易查询,链表易插入但又难查询,那么将两者结合后,两方都能有一定互补了。而基于这个来说那我们就需要让链表数据尽可能的少,这样查询就会更快,也就是要散布的比较均匀,而Hash这种散列刚好能满足。

3、HashMap在1.7以前的实现方式?

a、底层数据结构采用 数组+链表的形式。

b、对于放入Hashmap的key进行了Hash运算后得到了更加散的值,将这个键值对存入数组内。

c、当key进行Hash运算后有重复的话,则需要比较新加入的key和已存在的key是否一致,不一致就将键值对存入对应的链表内。

4、HashMap在1.8以后的实现方式?

a、底层数据结构采用 数组+链表或者数组+红黑树的形式。

b、对于放入Hashmap的key进行了Hash运算后得到了更加散的值,将这个键值对存入数组内。

c、当key进行Hash运算后有重复的话,则需要比较新加入的key和已存在的key是否一致,不一致就将键值对存入对应的链表或红黑树内。

d、基于红黑树和链表的查询速率,在8个元素前存放入链表内,后面就会存在红黑树内。

5、为什么1.7前的hashMap有hashMap死链的问题?

a、首先,有一个点需要提前说明,数组有一个扩展的过程,因为随着使用者往map里面填充的数据越来越多,初始化默认的16就不够用了,需要扩容,那么当插入到当前长度的0.75后再插入数据,就会导致扩容。数组的长度就会翻2倍了。

b、由于1.7之前使用的头插法,当数组扩容后,链表内数据会被一个个找到重新进行Hash的运算,当进行计算时,如果第一个元素放入链表后他的指针指向的就是第二个元素,而如果是多线程情况下,第二个元素这是拿到了进行了hash运算,就会放在第一个的位置上,那么他的下一个就应该是第一个元素,而如果第一个线程还没有处理好指针的指向问题,那么他还是指向这个第二个元素,就会形成,第一个元素的下一个元素是第二个元素,第二个元素的第一个又是第一个元素,这样就没办法停止了,从而形成了死链了。

6、为什么1.8后的hashMap没有hashMap死链的问题?

a、由于存在数组的扩容,底层也还有链表的参与,那么1.8后的hashmap也可能会有死链的可能的,而这里采用了尾插法来避免了问题的发生,当第一个元素重新hash运算后会被排到最后,此时,第二个线程拿到第二个元素将第二个元素插到最后,刚好是第一个元素的后面,那么这个不管第一个元素的指针指向是不是已经处理完,都是对的,第一个元素后面是第二个元素,处理完第二个元素就会处理第三个元素,直到所有的都处理完结束循环。

b、这里仅仅是说多线程环境下HashMap不会发生死链的问题,但是依旧是线程不安全的,这个点还是需要注意的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值