new HashMap(8)后面扩容是怎样的
时间: 2023-02-10 13:12:52 浏览: 51
当HashMap的容量达到阈值(threshold)时,就会发生扩容。具体来说,如果当前HashMap的容量已经达到阈值,那么再插入一个新的键值对就会触发扩容。扩容的过程如下:
1. 计算新的容量:新容量 = 当前容量 * 2 + 1(这里的+1是为了保证新容量是奇数)
2. 创建一个新的散列数组,并把原来的散列数组中的所有元素复制到新数组中。
3. 使用新数组替换原来的散列数组,并更新阈值。
扩容会带来额外的时间和空间开销,因此应该尽量避免过于频繁的扩容。正确设置初始容量和装载因子(load factor)可以帮助减少扩容的次数。
相关问题
HashMap是如何扩容的
HashMap 的扩容是通过创建一个更大的数组来实现的,具体过程如下:
1. 当HashMap中的元素个数达到了负载因子(load factor)乘以数组大小时,就需要进行扩容。默认情况下,负载因子为0.75,即当元素个数达到当前数组大小的0.75倍时就扩容。
2. 创建一个新的数组,大小是原数组大小的两倍,并将原数组中的所有元素重新计算hash值,然后加入到新数组对应的位置上。
3. 如果新数组对应的位置上已经有元素了,就发生了冲突,需要进行链表或红黑树的处理。
4. 扩容完成后,原来的数组会被垃圾回收机制回收,释放内存。
需要注意的是,HashMap的扩容是一个比较耗时的操作,因此在使用HashMap时需要合理设置负载因子和初始化数组大小,以避免频繁扩容。
hashmap 是怎么扩容的
HashMap 在初始化时会创建一个指定容量大小的哈希表,当存储的键值对数量超过了负载因子(默认为 0.75)与当前容量的乘积时,就会触发扩容操作。
具体扩容过程如下:
1.创建一个新的哈希表,容量为原来的两倍。
2.遍历原哈希表中的每个 Entry 对象,将它们重新分配到新的哈希表中。
3.重新分配时,会根据每个 Entry 对象的 key 值重新计算哈希值,并将它们放到新的哈希表的对应位置上。如果新位置上已经有其他 Entry 对象,则将它们组织成一个链表。
4.最后,将原哈希表指向新的哈希表,完成扩容操作。
需要注意的是,扩容操作会比较耗时,因为需要将原哈希表中的所有 Entry 对象重新分配到新的哈希表中。因此,在创建 HashMap 时,尽量预估需要存储的键值对数量,并设置合适的初始容量,避免频繁扩容。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)