HashMap中的哈希冲突

一、核心原则:正确实现 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(),保持契约⭐⭐⭐⭐⭐
✅ 预估容量,设置合理的初始大小⭐⭐⭐⭐
✅ 优先使用 StringInteger 等标准类型作 key⭐⭐⭐⭐
✅ 避免用可变对象作 key⭐⭐⭐
✅ 理解 Java 8+ 的红黑树优化机制⭐⭐
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值