Map的另类初始化方式-使用匿名内部类加构造代码块

在平时使用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为什么可以使用这种方式初始化了。