HashMap是Java中常用的数据结构之一,它通过key-value的方式存储数据,以便于快速查找和访问。当HashMap中的元素数量超过了它的负载因子(load factor)与容量(capacity)的乘积时,就需要对HashMap进行扩容,以保证HashMap的性能。下面我们来浅谈一下HashMap的扩容机制,以及用代码示例演示HashMap的扩容过程。
首先,HashMap的扩容会发生在put操作时,即往HashMap中添加一个新的键值对时。在put操作中,当HashMap中的元素数量超过了它的负载因子与容量的乘积时,就需要对HashMap进行扩容。具体的扩容过程包括以下几个步骤:
接下来,我们用代码示例来演示HashMap的扩容过程:
- 计算新的容量 首先,需要计算新的HashMap的容量。计算公式如下:
newCapacity = oldCapacity << 1;
其中,<< 是位运算符,表示将 oldCapacity 左移一位,相当于乘以 2。
-
创建新的数组 根据计算出的新容量,创建一个新的Entry数组。
-
将旧数组中的元素复制到新数组中 将旧的Entry数组中的元素复制到新的Entry数组中,这个过程可能比较耗时。
-
计算新的hash值并插入到新的数组中 将新的元素插入到新的Entry数组中,并计算它们在数组中的位置。
-
调整threshold 最后,更新HashMap的阈值threshold,它等于新的容量与负载因子的乘积。
import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(4); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); map.put("key4", "value4"); map.put("key5", "value5"); } }
上面的代码中,我们创建了一个初始容量为4的HashMap,并添加了5个元素。由于HashMap的负载因子默认为0.75,当元素数量达到3时,HashMap就会进行扩容。接下来,我们通过debug模式来查看HashMap的扩容过程。
在put操作中,当元素数量达到阈值时,会调用resize方法进行扩容。在resize方法中,会根据当前容量计算出新容量,并创建新的Entry数组。具体代码如下:
void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return; } Entry[] newTable = new Entry[newCapacity]; transfer(newTable, initHashSeed