外观
HashMap 中的默认负载因子
在 Java
的 HashMap
中,默认负载因子(load factor
)的值是 0.75
。
负载因子是一个用于衡量 HashMap
填满程度的指标,它表示在哈希表的容量自动增加之前,哈希表可以达到多满的一种尺度。其计算公式为:负载因子 = 哈希表中已存储的键值对数量 / 哈希表的容量
。当哈希表中存储的键值对数量超过 负载因子 * 哈希表的容量
这个阈值时,HashMap
会进行扩容操作,即自动增加哈希表的容量。
默认负载因子选择 0.75
的原因:
- 时间成本:如果负载因子设置得过大,比如设置为
1.0
,这意味着哈希表要完全填满才会进行扩容。这样做虽然可以减少空间的浪费,但会导致哈希冲突的概率大大增加。因为随着键值对数量的增多,不同的键计算出相同的哈希桶位置的可能性就会变大,而处理哈希冲突(如使用链表或红黑树)会增加查找、插入和删除操作的时间复杂度。 - 空间成本:如果负载因子设置得过小,比如设置为
0.5
,那么哈希表在存储较少的键值对时就会进行扩容,这会导致哈希表中有大量的空闲位置,从而造成空间的浪费。
经过大量的实验和实践,将负载因子设置为 0.75
时,哈希冲突的概率相对较低,同时也能在一定程度上避免过多的空间浪费,使得 HashMap
在时间和空间上达到较好的平衡。
以下代码展示了 HashMap
中默认负载因子的使用:
import java.util.HashMap;
public class HashMapLoadFactorExample {
public static void main(String[] args) {
// 创建一个默认的 HashMap
HashMap<String, Integer> map = new HashMap<>();
// 向 map 中添加元素
for (int i = 0; i < 12; i++) {
map.put("key" + i, i);
}
// 当添加到一定数量的元素后,HashMap 会进行扩容
System.out.println("当前 map 的大小: " + map.size());
}
}
在上述代码中,HashMap
的初始容量是 16
,默认负载因子是 0.75,那么阈值就是 16 * 0.75 = 12
。当添加的元素数量达到 12
时,HashMap
就会进行扩容操作。