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

    一颗安安静静的小韭菜。文中如果有什么错误,欢迎指出。
  • 相关阅读:
    LeetCode 75. Sort Colors(按颜色进行排序)
    LeetCode 451. Sort Characters By Frequency(按照字符出现次数对字符串排序)
    LeetCode 347. Top K Frequent Elements(出现频率最多的 k 个元素)
    LeetCode 215. Kth Largest Element in an Array(数组求第k大)
    CF #629 Div.3 E(LCA)F
    系统函数
    CASE表达式
    循环得出数据库中所有的 DB_ID,DB_NAME
    数据库的编码问题
    检验临时表是否存在
  • 原文地址:https://www.cnblogs.com/c-Ajing/p/13448363.html
Copyright © 2011-2022 走看看