• 初始化集合的花样new HashMap<String, String>{ {put("str1":"abc");} }(转)


    Map集合的普通初始化方法:

    Map<String, String> map = new HashMap<String, String>();
            map.put("Name", "June");
            map.put("QQ", "2572073701");
    

      今天看到这样的写法:

     /** 不可重试异常 参数错误 **/
        @SuppressWarnings("serial")
        public static final Map<String, String> SMS_PARAM_ERROR_UNRETRY =
            new HashMap<String, String>() {
              {
                put(SMS_RESP_208001, "参数错误");
                put(SMS_RESP_208101, "有重复请求数据");
                put(SMS_RESP_208102, "资源竞争");
                put(SMS_RESP_208200, "数据库异常");
                put(SMS_RESP_208500, "缓存异常");
              }
            };

      前面以为是jdk7或者jdk8的新特征

    后面查看资料是利用继承、代码块、内部类的实现

    相当于创建的是一个HashMap的子类对象,且该子类中有实例代码块做一个初始化赋值操作,实例代码块中可以随意调用实例方法。

    代码:

     Map<String, String> map1 =  new HashMap<String, String>() {
                {
                    put("Name", "June");
                    put("QQ", "2572073701");
                }
            };
            for(Map.Entry<String, String> entry : map1.entrySet() ){
                System.out.println(entry.getKey() + ", " + entry.getValue() );
            }

    反编译:

    package kunpu.test1;
    
    import java.io.PrintStream;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    
    public class SimpleCollectCreateDemo1
    {
      public static void main(String[] args)
      {
        Map<String, String> map1 = new HashMap() {};
        for (Map.Entry<String, String> entry : map1.entrySet()) {
          System.out.println((String)entry.getKey() + ", " + (String)entry.getValue());
        }
      }
    }
    package kunpu.test1;
    
    import java.util.HashMap;
    
    final class SimpleCollectCreateDemo1$1
      extends HashMap<String, String>
    {
      SimpleCollectCreateDemo1$1()
      {
        put("Name", "June");
        put("QQ", "2572073701");
      }
    }

    同理,ArrayList等也可以使用同样的方式进行初始化:

    List<String> stringList = new ArrayList<String>(){
                {
                    add("str1");
                    add("str2");
                    remove("str1");
                }
            };
            for(String s : stringList){
                System.out.println(s);
            }

    在jdk1.7的新特征中进行了java集合的增强支持:

    摒弃了Java集合接口的实现类,如:ArrayListHashSetHashMap。而是直接采用[]{}的形式存入对象,采用[]的形式按照索引、键值来获取集合中的对象,如下:

    所以初始化集合的方式不是仅仅的死板哦。

    4、文艺写法的潜在问题
        文章开头提到的文艺写法的好处很明显就是一目了然。这里来罗列下此种方法的坏处,如果这个对象要串行化,可能会导致串行化失败。
      1.此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。

    2.上例中,其实是声明了一个继承自HashMap的子类。然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。解决办法:重新初始化为一个HashMap对象:

      new HashMap(map);  

    这样就可以正常初始化了。

    参考链接:http://blog.163.com/qqabc20082006@126/blog/static/22928525201022094041502/

  • 相关阅读:
    在Linux(Ubuntu)下安装Arial、Times New Roman等字体
    Qt的安装和使用中的常见问题(简略版)
    Qt的安装和使用中的常见问题(详细版)
    机械+固态双硬盘时机械硬盘卡顿问题解决
    在Qt(C++)中与Python混合编程
    在Notepad++中快捷选中多行
    在Linux下访问Windows共享文件夹
    Ubuntu下U盘只读文件系统,图标上锁,提示无法修改
    使用Qt Installer Framework制作软件安装包
    Swoole练习 websocket
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/8515860.html
Copyright © 2020-2023  润新知