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

HashSet 和 TreeSet 有什么区别?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

HashSet 按哈希与 equals 判重,不保证遍历顺序;TreeSet 按自然顺序或比较器排序,以比较结果为零判断是否已有元素。HashSet 的基本操作在哈希分布合适时通常接近 O(1),TreeSet 的 add、remove、contains 保证 O(log n)。选择还要看是否需要范围查询。

讲清原理

TreeSet 不是先用 equals 去重再排序,而是沿有序结构比较并定位。若比较器认为两个不同元素相等,它只保留其中一个。因此,为了符合一般 Set 的相等约定,排序规则应与 equals 一致。

HashSet 允许一个 null。TreeSet 使用自然顺序时拒绝 null;若提供能处理 null 的比较器,则可以支持它。“Set 都允许 null”与“TreeSet 绝不能装 null”都说得过满。

例子与易错点

Java 21 的 main 片段:

var a = new java.math.BigDecimal("1.0");
var b = new java.math.BigDecimal("1.00");
System.out.println(new java.util.HashSet<>(java.util.List.of(a, b)).size());
System.out.println(new java.util.TreeSet<>(java.util.List.of(a, b)).size());

输出 2、1。BigDecimal 的 equals 考虑标度,compareTo 则把这两个数比较为零。业务去重究竟看“数值”还是“数值加标度”,应先说清楚,再选实现。

相关题:第 27 题、第 30 题、第 48 题。

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

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