Java HashMap 初始化赋值 (不建议)

一、HashMap 初始化的文艺写法
看完这段代码,不少人都会以为这么写太啰嗦了,文艺青年通常这么来了:
HashMap<String, String> map = new HashMap<String, String>() {
    {
        put("name", "test");  
        put("age", "20"); 
    }
};json


看起来优雅了很多,一步到位,一鼓作气的赶脚。而后问题来了,这里的双括号”{{}}”到底什么意思,什么用法呢?
双括号”{{}}”,用来初始化,使代码简洁易读。
第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧其实是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。工具


二、推而广之,可初始化ArrayList、Set性能


List<String> names = new ArrayList<String>() {
    {
        for (int i = 0; i < 10; i++) {
            add("A" + i);
        }
    }
};
System.out.println(names.toString());测试


三、Java7:增长对collections的支持
在 Java 7 中你能够像 Ruby, Perl、Python 同样建立collections了, 可是这些集合是不可变的。.net


List<String> list = ["item"];
String item = list[0];
  
Set<String> set = {"item"};
  
Map<String, Integer> map = {"key" : 1};
int value = map["key"];xml


四、文艺写法的潜在问题对象


文章开头提到的文艺写法的好处很明显就是一目了然。这里来罗列下此种方法的坏处,若是这个对象要串行化,可能会致使串行化失败。
1.此种方式是匿名内部类的声明方式,因此引用中持有着外部类的引用。因此当时串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。
2.上例中,实际上是声明了一个继承自HashMap的子类。然而有些串行化方法,例如要经过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是没法串行化Hashset或者HashMap的子类的,从而致使串行化失败。解决办法:从新初始化为一个HashMap对象:blog


new HashMap(map);
这样就能够正常初始化了。继承


五、执行效率问题接口


当一种新的工具或者写法出现时,猿们都会来一句:性能怎么样?(这和男生谈论妹纸第一句通常都是:“长得咋样?三围多少?”一个道理:))
关于这个两种写法我这边笔记本上测试文艺写法、普通写法分别建立 10,000,000 个 Map 的结果是 121七、1064,相差 13%。
public class Test {
    public static void main(String[] args) {
        long st = System.currentTimeMillis();
        /*
        for (int i = 0; i < 10000000; i++) {
            HashMap<String, String> map = new HashMap<String, String>() {
                {
                    put("name", "test");
                    put("age", "20");
                }
            };
        }
        System.out.println(System.currentTimeMillis() - st); // 1217
        */


        for (int i = 0; i < 10000000; i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("name", "test");
            map.put("age", "20");
        }
        System.out.println(System.currentTimeMillis() - st); // 1064
    }
}

---------------------

本文来自 无名_四叶草 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zdyueguanyun/article/details/79216998?utm_source=copy 

相关文章
相关标签/搜索