HashSet 去重之后,顺序应该由谁保证
把列表放进 HashSet 能去重,但再拿出来可能不是原来的顺序。若测试只使用几个连续数字,这个问题还可能被掩盖。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Java Tutorial for Beginners
Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
把列表放进 HashSet 能去重,但再拿出来可能不是原来的顺序。若测试只使用几个连续数字,这个问题还可能被掩盖。
理解核心机制
HashSet 不承诺迭代顺序。需要保留首次出现次序时用 LinkedHashSet;需要排序时考虑 TreeSet,并确保比较规则与业务相等性一致。先确定顺序需求,再选数据结构。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
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 或比较器。可变元素和不一致的比较规则仍会造成问题;去重键也未必等同于整条业务对象。
继续练习
用大小写不同的字符串测试三种集合,分别写出“保留输入顺序”“字典序”和“不关心顺序”时的验收条件。