HashMap扩容机制
时间: 2023-06-26 18:01:51 浏览: 51
当HashMap中的元素个数超过了负载因子(load factor)与当前容量的乘积时,就会触发扩容操作。扩容操作会新建一个容量是原来两倍的数组,并且将原数组中的所有元素重新分配到新数组中。具体步骤如下:
1. 新建一个容量是原来两倍的数组,将原数组的元素重新映射到新数组中。
2. 对于每个元素,HashMap会调用其hashCode()方法得到一个哈希值,然后将这个哈希值对新数组的容量取模得到一个新的下标,将元素存储到新数组的对应位置上。
3. 如果新数组的某个位置已经有了元素,就会发生冲突(collision)。HashMap使用链表或红黑树来解决冲突。如果该位置上的元素个数小于等于8个,HashMap会将新元素插入到链表中;如果大于8个,HashMap会将链表转换为红黑树,再进行插入操作。
4. 所有元素都重新映射到新数组中后,原数组中的所有元素会被清除,释放内存空间。
值得注意的是,扩容操作是非常耗时的,因为需要将所有元素重新映射到新数组中。因此,为了避免频繁扩容,我们在创建HashMap对象时应该预估好元素个数,并且设置合适的负载因子。一般来说,负载因子的取值范围在0.5到0.75之间比较合适。
相关问题
hashmap扩容机制
HashMap扩容机制在1.7和1.8版本中有所不同。
在1.7版本中,当HashMap中的元素数量达到容量的75%时,就会触发扩容操作。扩容操作会将原来的数组大小扩大一倍,并将原来的元素重新分配到新的数组中。
而在1.8版本中,当HashMap中的元素数量达到容量的75%时,会先进行一次判断,如果当前桶的数量小于64,则进行扩容操作,将桶的数量扩大一倍。如果当前桶的数量大于等于64,则进行红黑树化操作,将链表转换为红黑树,提高查询效率。
总的来说,1.8版本的HashMap扩容机制更加智能化,能够根据当前的情况进行不同的操作,提高了HashMap的性能和效率。
hashmap 扩容机制
HashMap的扩容机制是指当HashMap中的元素个数超过数组长度乘以负载因子时,就会重新分配一个更大的数组,并将原来的元素重新计算哈希值并插入到新的数组中。不同版本的Java实现了不同的扩容机制。在JDK1.7版本中,HashMap的默认容器长度为16,扩容因子为0.75,以2的n次方扩容,最高可扩容30次。第一次扩容是在长度达到16*0.75=12的时候开始扩容,扩容后的长度为16*2^1=32。
在JDK1.8中,HashMap的扩容机制有以下改进:
- HashMap在第一次调用put方法时才会初始化数组,而不是在创建对象时就初始化。
- HashMap在初始化或扩容时,会根据指定或默认的容量找到不小于该容量的2的幂次方,并将其赋值给阈值。
- 然后在第一次调用put方法时,会将阈值赋值给数组长度,并让新的阈值等于数组长度乘以负载因子。
- 在扩容过程中,HashMap不需要重新计算节点的哈希值,而是根据哈希值最高位判断节点在新数组中的位置,要么在原位置,要么在原长度加上原位置处。
- 在扩容过程中,HashMap会正序遍历原来的数组,并保持链表中节点的相对顺序不变。
- 如果某个链表中的节点数超过8个,并且数组长度大于等于64,则会将链表转化为红黑树,提高查找效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [hashmap 扩容机制](https://blog.csdn.net/a772304419/article/details/130835555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* [HashMap的扩容机制](https://blog.csdn.net/eg1107/article/details/128228687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]