hashmap hashtable ConcurrentHashMap 扩容

hashmap扩容:

默认大小: 16, 增长因子:0.75

扩容点规则(什么时候扩容): 16*0.75=12

存储方式:数组+链表

扩容方法:扩容为原来的2倍

出现于:JDK1.2

扩容条件:

1、判断当前个数是否大于等于阈值

2、当前存放是否发生哈希碰撞

hashtable扩容:

默认大小: 11, 增长因子:0.75

扩容点规则(什么时候扩容): 11*0.75=12, (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1); MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

存储方式:数组+链表

扩容方法:扩容为原来的2倍+1

出现于:JDK1.0

ConcurrentHashMap 扩容:

默认大小: segment位16个,桶的数量是16,桶内hash表的数量是1,加载因子是0。75。

扩容点规则(什么时候扩容):

当往hashMap中成功插入一个key/value节点时,有可能触发扩容动作:

1、如果新增节点之后,所在链表的元素个数达到了阈值 8,则会调用treeifyBin方法把链表转换成红黑树,不过在结构转换之前,会对数组长度进行判断,实现如下:

如果数组长度n小于阈值MIN_TREEIFY_CAPACITY,默认是64,则会调用tryPresize方法把数组长度扩大到原来的两倍,并触发transfer方法,重新调整节点的位置。

2、新增节点之后,会调用addCount方法记录元素个数,并检查是否需要进行扩容,当数组元素个数达到阈值时,会触发transfer方法,重新调整节点的位置。

存储方式:segment+数组+链表

扩容方法:

出现于:JDK1.5

猜你喜欢

转载自blog.csdn.net/varyall/article/details/81277126