面试题答案
一键面试Map动态扩容情况
当Go语言中的Map使用的bucket数量达到6.5 * 负载因子时,会触发动态扩容。
相关参数
- 负载因子:Go语言Map的负载因子默认为6.5,它是一个比值,表示平均每个bucket存储的键值对数量。
动态扩容机制
- 双倍扩容:当触发扩容时,Map会分配一个新的更大的哈希表,新哈希表的bucket数量是原哈希表bucket数量的两倍。
- 重新哈希:原哈希表中的所有键值对会被重新计算哈希值并插入到新的哈希表中。这个过程称为rehashing,会导致性能开销。在扩容过程中,为了避免一次性rehashing带来的巨大开销,Go语言采用了一种渐进式的rehashing策略。即每次对Map进行插入、删除或查找操作时,都会顺带移动一小部分旧bucket中的键值对到新的bucket中,直到所有旧bucket中的键值对都迁移完成,此时旧的哈希表才会被释放。