一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java中 HashSet 怎么使用 Set.of 构建不可变去重集合

时间:2026-07-21 09:19:53 编辑:袖梨 来源:一聚教程网

Set.of创建的是不可变集合,非HashSet实现,自动去重但不接受null,也不支持修改;若需基于HashSet语义的不可变集合,须先构建HashSet再封装或用Guava ImmutableSet。

Set.of 创建的是不可变集合,它本身不基于 HashSet 实现,也不支持重复元素(自动去重),但不能通过它“构建 HashSet”——因为 Set.of 返回的是不可变的 Set 实现类(如 ImmutableSet),而非 HashSet 实例。

Set.of 本质是不可变集合,不是 HashSet

Set.of(...) 是 Java 9 引入的工厂方法,返回一个轻量级、不可修改的 Set。它的底层实现根据元素个数选择不同类(如 0–10 个元素用内部静态类,更多时用 ImmutableCollections.SetN),但绝不是 HashSet。它不接受 null,不允许添加/删除/修改,且自动去重(重复元素会被忽略,只保留一个)。

  • Set.of("a", "b", "a") → 包含 "a""b"(去重成功)
  • Set.of("a", "b", "a").add("c") → 抛出 UnsupportedOperationException
  • Set.of("a", "b", "a") instanceof HashSetfalse

如果需要不可变 + 基于 HashSet 的语义,得手动转换

若你明确需要一个“底层行为类似 HashSet(比如哈希查找、无序、允许自定义对象需重写 hashCode/equals)”的不可变集合,不能直接用 Set.of 得到 HashSet,但可以:

  • 先用 new HashSet(...) 构建可变集合(完成去重和初始化)
  • 再用 Collections.unmodifiableSet(...) 封装为不可变视图
  • 或使用 Guava 的 ImmutableSet.copyOf(...)(更安全,真正不可变)

示例:

立即学习“Java免费学习笔记(深入)”;

Set<String> immutable = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "a")));

Set.of 的去重规则和限制

它按 equals 判断重复,要求所有元素非 null,且必须满足 equals/hashCode 合约。对自定义类,仍需正确重写这两个方法;否则去重可能失效。

  • 重复字面量(如 "hello")会自动合并
  • 两个不同对象但 equals 为 true → 视为重复,只留其一
  • 传入 null → 直接抛 NullPointerException

什么时候该用 Set.of?

适合创建小规模、固定、已知内容的不可变去重集合,比如配置常量、枚举替代、临时校验集合等。它轻量、线程安全、创建快。但不适合动态构建、大集合或需要 HashSet 特有 API(如 capacityloadFactor 控制)的场景。

热门栏目