核心原理
Set 家族:不重复
Set 的核心是保证元素不重复。常见实现:
HashSet:去重,默认首选,不保证顺序LinkedHashSet:去重 + 保持插入顺序TreeSet:去重 + 自动排序EnumSet:枚举专用,高效
Set<String> tags = new HashSet<>();tags.add("java");tags.add("java");System.out.println(tags.size()); // 1HashSet 为什么最常用
基于哈希表;可理解为借助 HashMap 存储。特点:
- 不允许重复
- 允许一个
null - 不保证遍历顺序
add/remove/contains在哈希分布合理时通常很快
Set<String> langs = new HashSet<>();langs.add("Java");langs.add("Go");langs.add("Java");langs.add(null);System.out.println(langs.size()); // 3System.out.println(langs.contains("Go"));HashSet 判断重复的流程
- 计算
hashCode - 根据哈希定位
- 同位置已有元素 → 用
equals比较 equals == true才算重复

HashSet、LinkedHashSet、TreeSet 怎么选
| 需求 | 实现 |
|---|---|
| 只去重 | HashSet |
| 去重 + 插入顺序 | LinkedHashSet |
| 去重 + 排序 | TreeSet(元素需 Comparable 或传入 Comparator) |
常见陷阱
自定义对象未重写 equals 和 hashCode
业务上相等的两个对象,若未正确重写,去重会失效。
误以为 HashSet 只看 hashCode
必须 hashCode + equals;不同对象也可能哈希冲突。
面试速记
- HashSet 特点:允许一个 null、无序、依赖哈希。
- 去重为何关注 equals/hashCode:
HashSet靠二者判断重复。