最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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 HashSet→false
如果需要不可变 + 基于 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(如 capacity、loadFactor 控制)的场景。