Set 与 HashSet

上一篇:List · 下一篇:Queue

核心原理#

Set 家族:不重复#

Set 的核心是保证元素不重复。常见实现:

  • HashSet:去重,默认首选,不保证顺序
  • LinkedHashSet:去重 + 保持插入顺序
  • TreeSet:去重 + 自动排序
  • EnumSet:枚举专用,高效
Set<String> tags = new HashSet<>();
tags.add("java");
tags.add("java");
System.out.println(tags.size()); // 1

HashSet 为什么最常用#

基于哈希表;可理解为借助 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()); // 3
System.out.println(langs.contains("Go"));

HashSet 判断重复的流程#

  1. 计算 hashCode
  2. 根据哈希定位
  3. 同位置已有元素 → 用 equals 比较
  4. equals == true 才算重复

HashSet 去重流程
HashSet 去重流程

HashSet、LinkedHashSet、TreeSet 怎么选#

需求实现
只去重HashSet
去重 + 插入顺序LinkedHashSet
去重 + 排序TreeSet(元素需 Comparable 或传入 Comparator

常见陷阱#

自定义对象未重写 equals 和 hashCode#

业务上相等的两个对象,若未正确重写,去重会失效。

误以为 HashSet 只看 hashCode#

必须 hashCode + equals;不同对象也可能哈希冲突。

面试速记#

  • HashSet 特点:允许一个 null、无序、依赖哈希。
  • 去重为何关注 equals/hashCodeHashSet 靠二者判断重复。

集合面试 52 道

文章目录

文章目录