java 中创建和初始化 hashset 最直接的方式是使用双括号初始化语法,或者在构造时传入一个已有的集合。双括号初始化通过内部匿名类实例块实现,能在声明变量的同时完成元素填充,适合少量数据的快速测试或配置。如果数据量较大或需要保持代码整洁,推荐使用 java 9 引入的 set.of() 静态工厂方法,它返回一个不可变集合,性能更好且线程安全。

双括号初始化的具体实现与结构
双括号初始化利用了 Java 匿名内部类的特性。外层花括号定义了一个继承自 HashSet 的匿名类,内层花括号是该类的实例初始化块。当对象被创建时,构造函数调用父类逻辑,随后执行实例块中的 add() 操作。这种方式虽然简洁,但会生成额外的 .class 文件,且在序列化时可能带来问题,因此仅建议在非关键路径或测试代码中使用。

import java.util.HashSet;
import java.util.Set;
public class DoubleBraceInit {
public static void main(String[] args) {
// 使用双括号初始化 HashSet
Set<string> names = new HashSet() {{
add("Alice");
add("Bob");
add("Charlie");
}};
System.out.println(names);
// 输出: [Alice, Bob, Charlie]
}
}</string>
Java 9+ Set.of() 的替代方案
从 Java 9 开始,标准库提供了 Set.of() 方法,这是初始化固定元素集合的现代推荐做法。它接受可变参数,自动去重并构建一个不可变的 Set 实现。与 HashSet 不同,Set.of() 返回的对象不支持添加或删除元素,调用 add() 会抛出 UnsupportedOperationException。这种设计避免了意外修改,且在内存占用上通常比 HashSet 更小。

import java.util.Set;
public class SetOfInit {
public static void main(String[] args) {
// 使用 Set.of() 初始化不可变集合
Set<string> names = Set.of("Alice", "Bob", "Charlie");
System.out.println(names);
// 输出: [Alice, Bob, Charlie]
// 尝试修改会抛出异常
try {
names.add("David");
} catch (UnsupportedOperationException e) {
System.out.println("Cannot modify immutable set");
}
}
}</string>
Set.of() 处理 null 输入的结果
在使用 Set.of()进行初始化时,如果传入的参数中包含 null,程序会在运行时立即抛出 NullPointerException。这与 HashSet 允许存储单个 null 值的行为截然不同。HashSet 基于 HashMap 实现,底层允许键为 null,而 Set.of() 为了保持不可变性和一致性,严格禁止 null 元素。开发者在迁移代码时需特别注意此差异,避免空指针异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











