zoukankan      html  css  js  c++  java
  • java在hashmap初始化时赋初值

    Java中的HashMap是一种常用的数据结构,一般用来做数据字典或者Hash查找的容器。

    一般我们初始化并赋初值是这样做的:

    HashMap<String, Object> map = new HashMap<>();
    map.put("name", "yanggb");  
    map.put("name1", "huangq");

    但是有时候我们会想在一个表达式中完成初始化并赋初值的操作:

    HashMap<String, Object> map = new HashMap<>() {
        {
            put("name", "yanggb");
            put("name1", "huangq");
        }
    };

    这里用了双括号【{{}}】来初始化,使代码简洁易读。第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (Instance Initializer Block),这个块在内部匿名类构造时被执行。这种写法的好处很明显,就是一目了然。但是这种写法可能导致这个对象串行化失败的问题。

    其一,因为这种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当串行化这个集合时,外部类也会被不知不觉的串行化,而当外部类没有实现Serialize接口时,就会报错。其二,在上面的例子中,其实是声明了一个继承自HashMap的子类,然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,也就导致了串行化失败。解决办法是重新初始化为一个HashMap对象【new HashMap(map);】,这样就可以正常进行初始化了。

    另外要注意的是,这种使用双括号进行初始化的语法在执行效率上要比普通的初始化写法要稍低。

    最后,这个使用双括号进行初始化的语法同样适用于ArrayList和Set等集合。

    "一代人终将老去,可总有人正年轻。"

  • 相关阅读:
    【转】苹果App Store审核指南中文翻译(更新)
    ios中的coredata的使用
    iOS开发——网络编程OC篇&Socket编程
    [深入浅出Cocoa]iOS网络编程之Socket
    RESTful架构详解
    IOS开发 REST请求 ASIHTTPRequest用法
    iOS 8 AutoLayout与Size Class自悟
    nodejs入门demo
    微信公众号查询账户余额等
    微信公众号token验证失败的一些总结
  • 原文地址:https://www.cnblogs.com/yanggb/p/11590225.html
Copyright © 2011-2022 走看看