雙大括號初始化的理解和使用

2021-08-09 12:07:44 字數 2039 閱讀 6801

偶然機會看到一種物件初始的方式:

// 新建乙個列表,並賦值 "harry","tony","tom"

arraylistfriends = new arraylist() };

當然,對map集合也用同種初始化方式:

// 新建乙個map,並賦值

mapcat = new hashmap() };

這裡利用了內部類語法,這種方式比先new出物件然後再進行依次add要方便、簡潔許多。該方法稱之為「雙括號初始化」(double brace initialization)。

以arraylist的初始化為例,第一層花括號,首先對定義了乙個繼承自arraylist的匿名內部類

arraylistfriends = new arraylist() ;
第二層則是乙個自定義的物件構造塊(稱之為非靜態初始化塊)

new arraylist() ;
我們通過new得到arraylist的子類的例項化,然後上轉型為arraylist的引用

arraylistfriends = new arraylist() };
利用雙大括號初始化集合從效率上來說可能不如標準的集合初始化步驟。原因在於使用雙大括號初始化會導致內部類檔案的產生,而這個過程就會影響**的執行效率。

首先檢視不同初始化方式生成的.class檔案

例如以下**:

public class test1 };

arraylistlist2 = new arraylist() };

arraylistlist3 = new arraylist() };

arraylistlist4 = new arraylist() };

arraylistlist5 = new arraylist() };

………snip…

……arraylistlist1000 = new arraylist() };

system.out.println(system.currenttimemillis());

}}

test1編譯後生成的.class列表為:

test1$1.class

test1$2.class

test1$3.class

test1$4.class

test1$5.class

………snip…

……test1$1000.class

test1.class

生成了 1001個.class檔案

public class test2 

}

test2編譯後生成的.class列表為:

test2.class
只生成了1個.class檔案

執行時間

第一段**test1執行結果:

1508379452224

1508379452784

執行時間為:560毫秒

第二段**test2執行結果:

1508379671505

1508379671507

執行時間為:2毫秒

雖然說這個時間差距會根據電腦效能以及執行狀態有所變化,但也能說明雙大括號初始化方法要比常規方法用時長

綜上,(測試初始化資料較少(list未達到自增臨界點)的情況下)雙大括號初始化方法要比常規方法效率低:

1. 雙大括號初始化方法生成的.class檔案要比常規方法多

2. 雙大括號初始化方法執行時間要比常規方法長

串列埠的初始化和使用

新增全域性變數 handle hcomport 函式oninitdialog中的 bool cmycomdlg oninitdialog else msdn msdn library mobile and embedded development windows embedded windows e...

C vector的初始化和使用

01 vector的初始化 1 預設初始化 vectorilist1 二維陣列的定義 vector name vectorarrayname arraysize 區別是第二種的一維長度事先固定了。2 通過同型別的vector進行初始化 vectorilist2 ilist vectorilist2 ...

類的初始化和例項的初始化

有如下兩個類 father 父類 package com.yzx.test01 父類物件 父類初始化 1 j method 5 2 父類的靜態 塊 1 父類的例項化方法 1 super 最前 2 i test 3 父類的非靜態 塊 4 父類的無參構造 最後 非靜態方法前面其實有乙個預設物件this ...