HashSet 怎样检查重复并保证唯一?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
HashSet 把元素作为内部 HashMap 的键,先用哈希定位桶,再在候选中按同一引用或 equals 匹配。已有等价元素时 add 返回 false,不再新增。它能正确去重的前提是元素遵守 equals、hashCode 约定,且放入后相关状态不随意改变。
讲清原理
hashCode 相同只表示可能落到相同搜索范围,不能证明相等;equals 相等则必须同哈希,否则查找可能根本到不了另一个元素所在的桶。哈希碰撞可以被处理,违反相等性约定则不能指望容器替你修复。
可变键还有另一个问题:元素放入时按旧哈希确定位置,后来改变字段,并不会自动把旧记录搬到新位置。此时 contains、remove 可能找不到,去重也可能失常。需要修改这类字段时,应先在旧状态下移除,再修改并重新加入。
例子与易错点
Java 21 的 main 片段:
record UserId(int value) {}
var ids = new java.util.HashSet<UserId>();
System.out.println(ids.add(new UserId(7)));
System.out.println(ids.add(new UserId(7)));
System.out.println(ids.contains(new UserId(7)));
输出 true、false、true。record 为这个只含 int 的示例生成一致的值判等。record 若含可变成员,也不能自动推导为深度不可变,更不能无条件认为所有 record 都适合作为键。
相关题:第 13 题、第 29 题、第 30 题、第 43 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。