hashMap的扩容机制
时间: 2023-06-23 10:00:36 浏览: 50
HashMap是Java中非常常用的一种数据结构,它是一种哈希表实现,用于存储键值对。在HashMap内部,使用数组来存储元素。每个元素都是一个键值对,其中键和值都是对象。
HashMap的扩容机制:当HashMap中的元素个数超过了负载因子(默认为0.75)与当前数组容量的乘积时,就需要扩容数组。具体的扩容过程如下:
1. 创建一个新的数组,容量为原数组的两倍;
2. 将原数组中的所有元素重新计算哈希值,然后放入新数组中;
3. 释放原数组的空间。
需要注意的是,扩容过程中需要重新计算元素的哈希值,这是因为新的数组容量发生了变化,原来计算的哈希值可能会导致新的哈希冲突。为了保证新的数组能够正确存储所有元素,必须重新计算哈希值。
HashMap的扩容过程是比较耗时的,因此在设计HashMap时需要考虑好负载因子的大小,以及数组容量的初始化大小,以减少扩容的次数,提高HashMap的性能。
相关问题
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 ]