歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java 中 HashMap 初始化的另一種方式詳解

目錄

1、HashMap 初始化的文藝寫法
2、推而廣之
3、Java7:增加對 collections 的支持
4、文藝寫法的潛在問題
5、執行效率問題
6、Refer:
如果你接觸過不同的語言,

如果你接觸過不同的語言,從語法和代碼層面來說,Java 是一種不折不扣的“臃腫、啰嗦”的語言,從另一方面來說這種臃腫和啰嗦也體現了它嚴謹的一面,作為適合構建大型、復雜項目的理由之一。

1、HashMap 初始化的文藝寫法

HashMap 是一種常用的數據結構,一般用來做數據字典或者 Hash 查找的容器。普通青年一般會這麼初始化:

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

看完這段代碼,很多人都會覺得這麼寫太啰嗦了,對此,文藝青年一般這麼來了:

HashMap<String, String> map = new HashMap<String, String>() {
    {
        put("Name", "June"); 
        put("QQ", "4889983"); 
    }
};

嗯,看起來優雅了不少,一步到位,一氣呵成的趕腳。然後問題來了,有童鞋會問:納尼?這裡的雙括號到底什麼意思,什麼用法呢?哈哈,其實很簡單,看看下面的代碼你就知道啥意思了。

public class Test {

    /*private static HashMap<String, String> map = new HashMap<String, String>() {
        {
            put("Name", "June");
            put("QQ", "4889983");
        }
    };*/

    public Test() {
        System.out.println("Constructor called:構造器被調用");
    }

    static {
        System.out.println("Static block called:靜態塊被調用");
    }

    {
        System.out.println("Instance initializer called:實例初始化塊被調用");
    }

    public static void main(String[] args) {
        new Test();
        System.out.println("=======================");
        new Test();

    }
}

output:

Static block called:靜態塊被調用
Instance initializer called:實例初始化被調用
Constructor called:構造器被調用
=======================
Instance initializer called:實例初始化被調用
Constructor called:構造器被調用

Note:關於 static 的作用與用法如果不了解,請參考:

http://www.linuxidc.com/Linux/2014-06/103541.htm 為什麼 main 方法是 public static void?

http://www.linuxidc.com/Linux/2014-06/103542.htm 設計模式之 Java 中的單例模式(Singleton)

也就是說第一層括弧實際是定義了一個匿名內部類 (Anonymous Inner Class),第二層括弧實際上是一個實例初始化塊 (instance initializer block),這個塊在內部匿名類構造時被執行。這個塊之所以被叫做“實例初始化塊”是因為它們被定義在了一個類的實例范圍內。

編寫高質量代碼 改善Java程序的151個建議 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htm

Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm

Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm

Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm

Java對象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm

Copyright © Linux教程網 All Rights Reserved