concurrenthashmap扩容原理数组和链表
ConcurrentHashMap是Java中的一种实现了并发访问的HashMap,他的底层实现采用的是数组+链表+红黑树的混合数据结构,它的扩容原理也是采用数组的自动扩容。
一、ConcurrentHashMap的扩容原理
ConcurrentHashMap的扩容原理是采用数组的自动扩容,当表中的数据超过容量,ConcurrentHashMap就会对表进行扩充,表容量变为原来的2倍(默认扩容为2倍)
二、ConcurrentHashMap扩容算法
ConcurrentHashMap先根据初始化容量(默认容量16)先初始化一个长度为16的空数组,加载因子默认为0.75,当元素的个数超过容量的0.75倍,就会进行扩容,扩容后的容量就是原来的两倍,即32。
当ConcurrentHashMap进行扩容时,会创建一个新的数组,将原来数组中的每个元素重新插入到新数组中,并且根据新数组的大小重新计算元素的下标,这样扩容后的数组就能够有效地容纳更多的元素。
三、ConcurrentHashMap扩容操作
当ConcurrentHashMap进行扩容时,首先会创建一个新的空数组,然后将原来数组中的每个链表的头结点(JVM会为每个桶分配一个Node节点作为头结点)重新插入到新数组中,然后根据新数组的大小重新计算链表的头结点的下标,最后将新数组赋值给原来的数组。
四、ConcurrentHashMap扩容后的性能
当ConcurrentHashMap进行扩容后,由于链表的头结点的下标需要重新计算,导致某些元素会被重新划分到不同的桶中,这样可以有效地减少链表的长度,提高查询的性能,同时还可以减少Hash冲突的发生。
五、结论
ConcurrentHashMap的扩容原理是采用数组的自动扩容,当表中的数据超过容量,ConcurrentHashMap就会根据初始化容量(默认16)先初始化一个长度为16的空数组,然后根据加载因子(默认为0.75)判断是否需要扩容,如果需要扩容,就将数组容量变为原来的2倍,并且重新计算链表的头结点的下标,最后将新数组赋值给原来的数组。这样一来,C
oncurrentHashMap可以有效地容纳更多的元素,而且能够提高查询的性能,同时还可以减少Hash冲突的发生。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论