高频八股——HashMap 为什么每次扩容都是两倍?

在 Java 面试中,HashMap 相关的问题是面试官最喜欢考察的知识点之一,尤其是 HashMap 的哈希算法,以及由此引发的一个关键问题——“为什么 HashMap 每次扩容都是两倍?”

对于初学者来说,理解哈希算法可能会有些困难。因此,本文将用 三个核心步骤 拆解 HashMap 的哈希计算逻辑,并从这一原理出发,深入探讨 HashMap 采用 2 倍扩容 的原因。希望你读完后能对这个问题有更深入的理解。

1. 三步理解HashMap的哈希算法

在理解扩容问题前,我们需要先理解HashMap的哈希算法,主要包括以下三步:

在分析 HashMap 的扩容机制之前,我们需要先弄清楚 HashMap 是如何计算存储索引的,这个过程主要包括以下三步:

(1) 计算哈希值:调用 hashCode()

当我们向 HashMap 插入键值对时,JDK 首先会调用 hashCode() 方法计算 key 的哈希值。例如:

String key = "HashMap";
int h = key.hashCode();  // 计算哈希码 h

hashCode() 返回一个 32 位的整数(范围:-2147483648 ~ 2147483647),理论上可能产生 40 亿种不同的 key。如果直接使用 hashCode() 作为数组索引,那就意味着数组的长度需要达到 40 亿,这显然是不现实的。因此,HashMap 并不会直接使用 hashCode(),而是对其进行 进一步处理,使其能映射到合适的数组索引。

(2) 计算索引:位运算取模 (n - 1) & hash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值