目錄
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