热搜:前端 nest neovim nvim

hashmap扩容机制?(javahashmap扩容机制)

lxf2023-06-08 08:30:02

hashmap的扩展机制是重新计算容量,用新的数组代替原始数组。重新计算原数组的所有数据,插入新数组,然后指向新数组;如果数组在容量扩展前达到最大值,则直接将阈值设置为最大整数返回。

hashmap扩容机制?(javahashmap扩容机制)

本教程操作环境:windows7系统,java8a8a、Dell G3电脑。

什么是扩容(resize)?

 扩容(resize):就是重新计算容量,不断向HashMap对象添加元素。当HashMap对象中的数组不能装载更多元素时,对象需要扩大数组的长度,以便装载更多元素。当然,Java中的数组不能自动扩展。方法是用新的数组代替现有的小容量数组,就像我们用小桶装水一样。如果我们想装更多的水,我们必须换一个大桶。

什么时候扩容?

 当向容器添加元素时,会判断当前容器的元素数量,如果大于等于阈值(threshold),也就是说,当前容器中的元素数大于当前数组的长度乘以加载因子的值时,就会自动扩容。

hashmap扩容原理

hashMap扩容就是重新计算容量,不断向hashMap添加元素。当hashMap无法装载新元素时,对象需要扩大数组容量才能装入更多元素。

hashmap扩容机制?(javahashmap扩容机制)

HashMap容量扩展的特点是加载因子越大,空间利用率越高,扩展前需要填充的元素越多,put操作越快,但链表容易过长,hash碰撞概率大,get操作慢。加载因子越小,获取操作越快,链表越短,hash碰撞概率越低。然而,空间利用率很低。put元素过多会导致频繁扩展,影响性能。

hashmap扩容机制?(javahashmap扩容机制)

Hashmap的容量扩展原理:Hashmap的方法是用新数组代替原数组,重新计算原数组中的所有数据,插入新数组,然后指向新数组;如果数组在扩展前已经达到最大值,则直接将阈值设置为最大整数返回。

扩容的过程

 下面使用源代码 图片 本文介绍了HashMap的扩展过程。

/** 
 * HashMap 添加节点 
 * 
 * @param hash        当前key生成的hashcodedey 
 * @param key         要添加到 HashMap 的key 
 * @param value       要添加到 HashMap value 
 * @param bucketIndex 桶,也就是说,这个要加 HashMap 数据对应于数组位置下的标记 
 */  
void addEntry(int hash, K key, V value, int bucketIndex) {  
    //数组扩容条件:1.现有的keyy-value mappings的数量大于等于阈值  
    //             2.底层数组的bucketindex坐标不等于nullll  
    if ((size