Set.of创建的是不可变集合,非HashSet实现,自动去重但不接受null,也不支持修改;若需基于HashSet语义的不可变集合,须先构建HashSet再封装或用Guava ImmutableSet。
Set.of 创建的是不可变集合,它本身不基于 HashSet 实现,也不支持重复元素(自动去重),但不能通过它“构建 HashSet”——因为 Set.of 返回的是不可变的 Set 实现类(如 ImmutableSet),而非 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(比如哈希查找、无序、允许自定义对象需重写 hashCode/equals)”的不可变集合,不能直接用 Set.of 得到 HashSet,但可以:
new HashSet(...) 构建可变集合(完成去重和初始化)Collections.unmodifiableSet(...) 封装为不可变视图ImmutableSet.copyOf(...)(更安全,真正不可变)示例:
立即学习“Java免费学习笔记(深入)”;
Set<String> immutable = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "a")));它按 equals 判断重复,要求所有元素非 null,且必须满足 equals/hashCode 合约。对自定义类,仍需正确重写这两个方法;否则去重可能失效。
"hello")会自动合并equals 为 true → 视为重复,只留其一NullPointerException
适合创建小规模、固定、已知内容的不可变去重集合,比如配置常量、枚举替代、临时校验集合等。它轻量、线程安全、创建快。但不适合动态构建、大集合或需要 HashSet 特有 API(如 capacity、loadFactor 控制)的场景。