HashMap的原理

2018-07-02  本文已影响0人  Spring黎

一、HashMap的特点

1.HashMap的存储方式是无序的;

2.HashMap存储的key如果相同,则新的value会覆盖旧的value;

3.HashMap是线程不安全的。

二、HashMap的负载因子(0.75)

1.负载因子=尺寸/容量,尺寸为当前元素的项数,容量为集合的桶位数。

2.再散列:首先进行扩容,大致为当前容量的两倍,然后将当前集合中的元素,储存到新的集合中。

3.当HashMap的负载因子达到0.75时,进行再散列。

三、HashMap的内部原理

1.当HashMap调用put方法时,首先根据key,使用hashcode()方法,计算它的hashcode值,找到对应的bucket(桶位),进行存储。

2.当两个key相同时,后面的value值会覆盖前面得value值。

3.当两个key的hashcode值相同时,会发生“碰撞”,将新的value值链接在旧的value值的前面或后面,形成一个链表,进行存储。

四、HashMap线程不安全的原因

1.HashMap进行多线程操作时,碰撞和扩容导致线程不安全。

2.当多线程调用put方法时,同时调用了addEntry方法,以上两个方法是异步的(非synchronized的),会因为“碰撞”,当两个数据的链表插入位置相同时,其中一个数据丢失。

3.当多线程进行扩容操作时,调用resize方法,因为是异步的,最后只有一组集合数据成功存入新的集合,其他数据丢失。

上一篇下一篇

猜你喜欢

热点阅读