Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

HashMap 怎样处理哈希冲突?

查看完整题解

参考回答

直接回答

不同键可能得到相同哈希,或经下标计算落入同一桶。HashMap 允许它们共存,在桶内继续比较键。OpenJDK 21 使用链表或树桶组织这些条目,并在合适条件下扩容或树化;相等键则更新原映射,不是再追加一条。冲突与重复键是两种情况。

讲清原理

哈希把很多可能的键映射到有限桶,碰撞无法完全避免。链表逐个检查候选;树桶在适用的比较条件下改善严重碰撞,但不能因此承诺任意自定义键的最坏查找都严格 O(log n),键的可比较性和同哈希情况仍影响路径。

扩容把桶分得更细,能缓解部分冲突;若所有键的哈希完全一样,仅增加桶数也不能把它们分散。更好的键哈希可以改善分布,但必须先满足“equals 相等则同哈希”。

先定位桶,再比较键;桶相同不代表键相等
先定位桶,再比较键;桶相同不代表键相等

例子与易错点

Java 21 的 main 片段:

System.out.println("Aa".hashCode() == "BB".hashCode());
var map = new java.util.HashMap<String, Integer>();
map.put("Aa", 1);
map.put("BB", 2);
System.out.println(map.size() + ":" + map.get("BB"));

输出 true、2:2。两个字符串同哈希但不相等,因此保存两条映射。不要把覆盖旧值解释成哈希冲突处理;覆盖发生在键匹配时。

相关题:第 2 题、第 30 题、第 40 题、第 41 题、第 44 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。