大话HashMap原理

1、HashMap概念

HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap储存的是键值对,HashMap很快。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。(因为他支持null值和null键所以我们很多时候不用hashtable,hashtable不支持)。

2、HashMap原理
在这里插入图片描述这是网上找的一个原理图,从图可以看出hashmap底层其实就是 数组+链表(j8以前),j8以后又发生了变化增加了 红黑树
那为什么hashmap底层是这样的呢,其实原因很简单因为hashmap有个固定数组大小,然后数组下标是通过hashcode计算的,当数据量超过数组大小的时候,下标会发生碰撞,也就是:假设10条数据,数组默认长度是8这样就有两条数据的下标会跟其他的发生碰撞,但是这两条数据不能覆盖原先位置的,因此就采用了链表的方式,j8后为什么又增加了红黑树呢?因为链接的查询效率很慢,二叉树插入效率又很慢,因此选择了处于两者中间的红黑树。j8如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表.

3、HashMap 是线程安全的吗,为什么不是线程安全的?
不是线程安全
我们都知道HashMap初始容量大小为16,一般来说,当有数据要插入时,都会检查容量有没有超过设定的thredhold,如果超过,需要增大Hash表的尺寸,但是这样一来,整个Hash表里的元素都需要被重算一遍。这叫rehash,这个成本相当的大。
单线程时候是没有问题的,当多个线程同时put的时候就会出现环形链表

代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast策略。仅仅这一点就可以告诉我们它不是线程安全的。

-------------------------------写的不好仅供参考。

猜你喜欢

转载自blog.csdn.net/weixin_42812598/article/details/89486062