在平时使用Map时,很多时候我们都是用下面的方式初始化的:
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
map.put("1", 1);
map.put("2", 2);
System.out.println(map.size());
}
当Map中初始化的值是固定的时候,有没有其他方法初始化呢,答案是有的:
public static void main(String[] args) {
Map<String, Object> map2 = new HashMap<String, Object>() {
/**
*
*/
private static final long serialVersionUID = 7823719791254471529L;
{
this.put("1", 1);
put("2", 2);
}
};
System.out.println(map2.size());
}
使用上面的代码也可以初始化成功,这里用到了匿名内部类加构造代码块的方式初始化。使用这种方式时,HashMap的泛型是必须加上的否则会报错,上面代码中第一个{}是声明一个匿名内部类,里面的第二个{}是用构造代码块进行初始化操作。
当一个类实例化的时候就会调用构造代码块,执行里面的代码,然后才会调用构造函数进行类的初始化,下面代码可以更好的说明:
public class CThread extends Thread {
{
this.setName("构造代码块设置线程名称");
}
public CThread() {
this.setName("构造函数设置线程名称");
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println("线程名称: " + threadName);
}
}
public static void main(String[] args) {
new CThread().start();
}
运行结果:
线程名称: 构造函数设置线程名称
注释掉构造函数以后,运行结果:
线程名称: 构造代码块设置线程名称
由上面的代码就可以理解,Map为什么可以使用这种方式初始化了。