HashMap 怎样处理哈希冲突?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
不同键可能得到相同哈希,或经下标计算落入同一桶。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 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。