一、核心原则:正确实现 hashCode()
二、合理设置 HashMap 初始容量
- 默认初始容量 = 16
- 负载因子 = 0.75 → 超过 12 个元素就扩容
- 如果预知数据量大,频繁扩容 + rehash 会增加冲突概率和性能开销
// 预估 size = 1000
int initialCapacity = (int) Math.ceil(1000 / 0.75) + 1; // ≈ 1334
Map<Key, Value> map = new HashMap<>(initialCapacity);
new HashMap<>(2048); // 对于大量数据
三、选择高质量的 Key 类型
| Key 类型 | 是否推荐 | 原因 |
|---|
String | ✅ 强烈推荐 | hashCode() 实现优秀(多项式滚动哈希),分布均匀 |
Integer / Long | ✅ 推荐 | 哈希即自身值(或扰动后),无冲突(除非值相同) |
| 自定义类 | ⚠️ 谨慎 | 必须正确重写 hashCode() 和 equals() |
| 数组、List(未包装) | ❌ 不推荐 | 默认 hashCode() 基于内存地址,无法按内容比较 |
✅ 示例:用 String 做 key 天然抗冲突:
map.put("user_123", user); // 安全高效
最佳实践总结(面试/开发 checklist)
| 措施 | 重要性 |
|---|
✅ 正确重写 hashCode()(用 Objects.hash) | ⭐⭐⭐⭐⭐ |
✅ 同时重写 equals(),保持契约 | ⭐⭐⭐⭐⭐ |
| ✅ 预估容量,设置合理的初始大小 | ⭐⭐⭐⭐ |
✅ 优先使用 String、Integer 等标准类型作 key | ⭐⭐⭐⭐ |
| ✅ 避免用可变对象作 key | ⭐⭐⭐ |
| ✅ 理解 Java 8+ 的红黑树优化机制 | ⭐⭐ |