一、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