1. 程式人生 > >Java 中 HashMap 初始化時賦值

Java 中 HashMap 初始化時賦值

lec SM 解決 道理 test ack 增加 數據結構 解決辦法

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>() {
{
map.put("name", "test");
map.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>();
map.put("name", "test");
map.put("age", "20");
}
System.out.println(System.currentTimeMillis() - st); // 1064
}
}

Java 中 HashMap 初始化時賦值