WMX · 随记
·Java· 3 分钟阅读

HashSet 去重之后,顺序应该由谁保证

把列表放进 HashSet 能去重,但再拿出来可能不是原来的顺序。若测试只使用几个连续数字,这个问题还可能被掩盖。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Tutorial for Beginners

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

把列表放进 HashSet 能去重,但再拿出来可能不是原来的顺序。若测试只使用几个连续数字,这个问题还可能被掩盖。

理解核心机制

HashSet 不承诺迭代顺序。需要保留首次出现次序时用 LinkedHashSet;需要排序时考虑 TreeSet,并确保比较规则与业务相等性一致。先确定顺序需求,再选数据结构。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java10 行 · 可横向滚动
import java.util.LinkedHashSet;
import java.util.List;
import java.util.TreeSet;
public class Demo {
    public static void main(String[] args) {
        var input = List.of("b", "a", "b", "c");
        System.out.println(new LinkedHashSet<>(input));
        System.out.println(new TreeSet<>(input));
    }
}

适用边界与常见误区

Set 的正确性依赖 equals/hashCode 或比较器。可变元素和不一致的比较规则仍会造成问题;去重键也未必等同于整条业务对象。

继续练习

用大小写不同的字符串测试三种集合,分别写出“保留输入顺序”“字典序”和“不关心顺序”时的验收条件。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档