HashMaps & HashSets
为什么 HashMap 很重要
HashMap 提供平均 O(1) 的查找——是后端系统中最广泛使用的数据结构:
- 缓存:Redis、Memcached 使用哈希表进行键值存储
- 会话管理:用户会话按会话 ID 存储
- 数据库索引:精确匹配查询的哈希索引
- 计数/频率统计:词频统计、分析、去重
实际影响:拥有 100 万条目的 HashMap 执行查找只需 O(1) ~50ns,而线性搜索 100 万个数组元素需要 ~5ms——慢 100,000 倍。
核心概念
哈希函数
将键转换为数组索引:
int index = Math.abs(key.hashCode()) % array.length;
好的哈希函数特性:
- 确定性:相同键始终产生相同哈希值
- 均匀分布:将键均匀分散到各桶中
- 快速计算:O(1) 计算
Java 的 hashCode() 契约
// String.hashCode() 实现
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i]; // 31 是质数(分布好)
}
hash = h;
}
return h;
}
契约:
- 如果
equals()返回 true,hashCode()必须返回相同值 - 如果
equals()返回 false,hashCode()应该