Java 中 HashMap 初始化時賦值


 

1、HashMap 初始化的文藝寫法

HashMap 是一種常用的數據結構,一般用來做數據字典或者 Hash 查找的容器。普通青年一般會這么初始化:
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", "test");  
map.put("age", "20");


看完這段代碼,很多人都會覺得這么寫太啰嗦了,文藝青年一般這么來了:
HashMap<String, String> map = new HashMap<String, String>() {
    {
        put("name", "test");  
        put("age", "20"); 
    }
};


看起來優雅了不少,一步到位,一氣呵成的趕腳。然后問題來了,這里的雙括號”{{}}”到底什么意思,什么用法呢?
雙括號”{{}}”,用來初始化,使代碼簡潔易讀。
第一層括弧實際是定義了一個匿名內部類 (Anonymous Inner Class),第二層括弧實際上是一個實例初始化塊 (instance initializer block),這個塊在內部匿名類構造時被執行。


2、推而廣之,可初始化ArrayList、Set


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


3、Java7:增加對collections的支持
在 Java 7 中你可以像 Ruby, Perl、Python 一樣創建collections了, 但是這些集合是不可變的。


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


4、文藝寫法的潛在問題


文章開頭提到的文藝寫法的好處很明顯就是一目了然。這里來羅列下此種方法的壞處,如果這個對象要串行化,可能會導致串行化失敗。
1.此種方式是匿名內部類的聲明方式,所以引用中持有着外部類的引用。所以當時串行化這個集合時外部類也會被不知不覺的串行化,當外部類沒有實現serialize接口時,就會報錯。
2.上例中,其實是聲明了一個繼承自HashMap的子類。然而有些串行化方法,例如要通過Gson串行化為json,或者要串行化為xml時,類庫中提供的方式,是無法串行化Hashset或者HashMap的子類的,從而導致串行化失敗。解決辦法:重新初始化為一個HashMap對象:


new HashMap(map);
這樣就可以正常初始化了。


5、執行效率問題


當一種新的工具或者寫法出現時,猿們都會來一句:性能怎么樣?(這和男生談論妹紙第一句一般都是:“長得咋樣?三圍多少?”一個道理:))
關於這個兩種寫法我這邊筆記本上測試文藝寫法、普通寫法分別創建 10,000,000 個 Map 的結果是 1217、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>();
            put("name", "test");
            put("age", "20");
        }
        System.out.println(System.currentTimeMillis() - st); // 1064
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM