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

    一颗安安静静的小韭菜。文中如果有什么错误,欢迎指出。
  • 相关阅读:
    innodb的存储结构
    使用zabbix邮件发送报表
    如何使用yum下载rpm包
    redis cluster节点管理测试
    redis迁移工具-redis-migrate-tool使用测试
    redis客户端连接异常
    redis sentinel基本命令与参数
    [转]redis-cli的一些有趣也很有用的功能
    [转]为什么使用 Redis及其产品定位
    Redis多机常用架构-cluster
  • 原文地址:https://www.cnblogs.com/c-Ajing/p/13448363.html
Copyright © 2011-2022 走看看