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

HashSet 内部怎样保存和判断元素?

查看完整题解

参考回答

直接回答

HashSet 内部用 HashMap 保存元素:元素作为键,值使用统一的占位对象。add 是否新增,取决于内部映射里是否已经有相等的键;contains 与 remove 也借助键查找。因此,HashSet 依赖元素稳定的 hashCode 与 equals,而不是把对象的地址当作唯一标准。

讲清原理

先用哈希缩小到某个桶,再比较候选键;同一引用可以直接匹配,其他候选依据 equals。两个不同对象若业务上相等,就必须给出相同 hashCode。不同对象即便碰巧同哈希,也仍能同时保留,因为桶内还会继续判等。

占位值只用于复用 Map 的机制,不是每个元素各自有一份业务值。HashSet 不保证遍历顺序,也不会因为底层数组看起来有下标就提供位置访问能力。

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

例子与易错点

Java 21 的 main 片段:

var words = new java.util.HashSet<String>();
System.out.println(words.add("java"));
System.out.println(words.add(new String("java")));
System.out.println(words.size());

输出 true、false、1。第二次没有新增,也不会把已有元素替换成新对象。若自定义类型只重写 equals 而没同步重写 hashCode,相等对象可能被分到不同桶,导致去重失效;这属于键的约定被破坏。

相关题:第 2 题、第 29 题、第 30 题、第 40 题。

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

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