Set 有哪些常见实现,怎样选择?
查看完整题解
参考回答
直接回答
常见选择是 HashSet、LinkedHashSet、TreeSet:分别适合普通去重、保留相遇顺序、按比较规则排序和范围导航。还有适合枚举的 EnumSet,以及不同并发需求下的 CopyOnWriteArraySet、ConcurrentSkipListSet,或 ConcurrentHashMap.newKeySet。不存在满足所有要求的默认 Set。
讲清原理
HashSet 按 equals 与 hashCode 去重,不承诺顺序;LinkedHashSet 通常保留插入顺序,Java 21 还提供显式首尾操作;TreeSet 按比较为零识别已有元素。顺序、判等方式和线程共享需求应一起考虑。
CopyOnWriteArraySet 适合小且读多写少的集合,但修改要复制数组;ConcurrentSkipListSet 提供有序并发集合,其迭代不等同于固定快照。EnumSet 针对同一种枚举类型组织成员,不能混装不同枚举类型。
例子与易错点
需要展示去重后的首次出现次序,可用 LinkedHashSet;要查询某个时间点附近的记录,考虑 TreeSet;只问“是否已见过这个编号”,HashSet 通常更直接。
Set.of(...) 创建不可修改集合,重复参数会报错,而不是默默去重。选择实现前要明确:重复输入应拒绝,还是保留一个;元素内部可变状态是否会破坏判等。
相关题:第 6 题、第 30 题、第 34 题、第 48 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。