zoukankan      html  css  js  c++  java
  • 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为什么可以使用这种方式初始化了。

    一颗安安静静的小韭菜。文中如果有什么错误,欢迎指出。
  • 相关阅读:
    Infopath Notify 弹出提示信息
    window.showModalDialog 返回值
    【转】获得正文内容中的所有img标签的图片路径
    Json Datable Convert
    Sharepoint 列表 附件 小功能
    Surgey 权限更改
    SQL 触发器用于IP记录转换
    Caml语句 查询分配给当前用户及当前组
    jquery 1.3.2 auto referenced when new web application in VSTS2010(DEV10)
    TFS diff/merge configuration
  • 原文地址:https://www.cnblogs.com/c-Ajing/p/13448363.html
Copyright © 2011-2022 走看看