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 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。