使用静态初始化块(Static Initialization Block)
示例代码:
import java.util.HashMap;
import java.util.Map;public class Main {public static void main(String[] args) {// 使用静态初始化块批量添加元素Map<String, Integer> hashMap = new HashMap<>() {{put("A", 1);put("B", 2);put("C", 3);}};// 输出HashMap的内容System.out.println(hashMap);}
}
上述创建 HashMap 的方式使用了双大括号初始化块的技巧。这种方式实际上是创建了一个匿名内部类的实例,并在该类的初始化块中进行批量添加元素的操作。
让我们逐步解析这个代码片段:
-
new HashMap<>()
: 这是创建 HashMap 对象的语法,<>
中的类型参数可以省略,因为在 Java 7 之后可以使用钻石操作符来进行类型推断。 -
{{ ... }}
: 这里使用了两对大括号,外层大括号表示创建了一个匿名内部类的实例,内层大括号表示该匿名内部类的初始化块。 -
put("A", 1);
,put("B", 2);
,put("C", 3);
: 这些语句在初始化块中,即在匿名内部类被创建时执行。它们实际上是在调用 HashMap 实例的put()
方法来添加键值对。
这种方式看起来简洁,因为它把初始化和添加元素的过程放在了一起。然而,它也有一些缺点:
- 匿名内部类会引入额外的类加载和初始化,可能对性能产生一些影响。
- 这种方式不能保证线程安全,因为 HashMap 实例是在静态初始化块中创建的,而静态初始化块是在类被加载时执行的,可能会被多个线程同时访问。
因此,在实际开发中,如果性能和线程安全是考虑的因素,建议使用其他方式来初始化 HashMap。