哈希表面试题总结:哈希冲突、扩容与 Java HashMap
哈希表先把键经哈希函数转换为整数,再映射到桶。理想情况下只需定位一个桶,因此查询、插入和删除平均接近 O(1)。哈希函数应稳定、计算快且分布均匀,但不同键映射到同一桶的冲突不可完全避免。
拉链法让每个桶保存链表或树,冲突元素在桶内继续比较;开放寻址法则按探测规则寻找其他空位。负载因子表示元素数与桶数的比例,过高会增加冲突。超过阈值时通常申请更大数组并重新分布元素,扩容单次为 O(n),但分摊到多次插入后仍可视作摊还常数。
Java HashMap 的键必须遵守 equals 与 hashCode 契约:相等对象必须有相同哈希值,反之不一定成立。可变对象若作为键后改变参与哈希的字段,可能再也无法按新状态找到原条目。JDK 8 的桶在冲突链较长且容量达到条件时可树化,以改善极端查询,但这不意味着所有操作绝对常数。
查询步骤是计算扰动后的哈希、定位桶、再逐个或按树比较哈希和键;因此平均复杂度依赖分布和扩容策略,最坏情况仍需结合实现说明。空间通常为 O(n+桶数)。
常见误区是把哈希等同加密、认为无冲突、忽略扩容停顿、依赖遍历顺序,以及在并发写入时直接共享普通 HashMap。小结:哈希表以空间和顺序性换取按键快速访问,工程质量取决于键契约、分布、容量与并发策略。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dai Wei!
评论

