Java小剧场:HashMap为啥总爱"搞扩容"?

19 阅读1分钟

一、核心概念

HashMap是键值对存储容器,底层是数组+链表/红黑树,默认初始容量16、负载因子0.75,元素存满75%就扩容,扩容后容量翻倍,目的是减少哈希冲突、保证操作效率。

二、关键语法&代码示例

1. 基础使用

// 初始化HashMap
HashMap<String, Integer> map = new HashMap<>();
// 存元素
map.put("Java", 100);
map.put("进阶", 90);
map.put("扩容", 80);
// 取元素
System.out.println(map.get("Java")); // 输出100
// 遍历元素
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ":" + entry.getValue());
}

 

2. 扩容关键场景演示

// 自定义初始容量的HashMap
HashMap<String, String> resizeMap = new HashMap<>(2); // 初始容量2,负载因子默认0.75
// 存3个元素,触发扩容(2*0.75=1.5,存第2个就触达阈值,存第3个时扩容)
resizeMap.put("a", "1");
resizeMap.put("b", "2");
resizeMap.put("c", "3");
// 输出扩容后的容量(底层table.length)
System.out.println(getCapacity(resizeMap)); // 输出4(翻倍扩容)

 

3. 辅助获取容量方法

// 反射获取HashMap实际容量
public static int getCapacity(HashMap<?, ?> map) throws Exception {
    Field tableField = HashMap.class.getDeclaredField("table");
    tableField.setAccessible(true);
    Object[] table = (Object[]) tableField.get(map);
    return table.length;
}

 

三、核心总结

  • 初始容量选2的幂次,减少哈希计算冲突;
  • 负载因子0.75是效率与空间的平衡,不用轻易改;
  • 频繁扩容耗性能,预知数据量时提前设初始容量更高效。