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

    一颗安安静静的小韭菜。文中如果有什么错误,欢迎指出。
  • 相关阅读:
    Python正则表达式很难?一篇文章搞定他,不是我吹!
    该用Python还是SQL?4个案例教你节省时间
    解决mysql中只能通过localhost访问不能通过ip访问的问题
    MySql按周/月/日分组统计数据的方法
    jquery清空form表单
    eclipse 创建 maven web工程
    微信授权登录
    bootstrap滑动开关插件使用
    去除编译警告@SuppressWarnings注解用法详解(转)
    dataTables添加序号和行选中框
  • 原文地址:https://www.cnblogs.com/c-Ajing/p/13448363.html
Copyright © 2011-2022 走看看