您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java中雙大括號初始化怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中雙大括號初始化怎么使用”吧!
偶然機會看到一種對象初始的方式:
// 新建一個列表,并賦值 "Harry","Tony","Tom" ArrayList<String> friends = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); }};
當然,對Map集合也用同種初始化方式:
// 新建一個Map,并賦值 Map<String, Object> cat = new HashMap<String, Object>() {{ put("name", "Tom"); put("age", 10); }};
這里利用了內部類語法,這種方式比先new出對象然后再進行依次add要方便、簡潔許多。該方法稱之為“雙括號初始化”(double brace initialization)。
以ArrayList的初始化為例,第一層花括號,首先對定義了一個繼承自ArrayList的匿名內部類
ArrayList<String> friends = new ArrayList<String>() { // 這里什么操作都沒有,全部繼承自父類(ArrayList) };
第二層則是一個自定義的對象構造塊(稱之為 非靜態初始化塊)
new ArrayList<String>() { // 這里什么操作都沒有,全部繼承自父類(ArrayList) };
我們通過new得到ArrayList的子類的實例化,然后上轉型為ArrayList的引用
ArrayList<String> friends = new ArrayList<String>() {{}};
我們得到的 friends 實際上是ArrayList的子類的引用,但在功能上沒有任何改變
相比于常規標準方式進行初始化要簡潔許多(但代碼可讀性相對會差)
利用雙大括號初始化集合從效率上來說可能不如標準的集合初始化步驟。原因在于使用雙大括號初始化會導致內部類文件的產生,而這個過程就會影響代碼的執行效率。
首先查看不同初始化方式生成的.class文件
例如以下代碼:
public class Test1 { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); ArrayList<String> list1 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list2 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list3 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list4 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list5 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; …… …snip… …… ArrayList<String> list1000 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; 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 { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); ArrayList<String> list1 = new ArrayList<>(); list1.add("Harry"); list1.add("Tony"); list1.add("Tom"); list1.add("Jerry"); ArrayList<String> list2 = new ArrayList<>(); list2.add("Harry"); list2.add("Tony"); list2.add("Tom"); list2.add("Jerry"); ArrayList<String> list3 = new ArrayList<>(); list3.add("Harry"); list3.add("Tony"); list3.add("Tom"); list3.add("Jerry"); ArrayList<String> list4 = new ArrayList<>(); list4.add("Harry"); list4.add("Tony"); list4.add("Tom"); list4.add("Jerry"); ArrayList<String> list5 = new ArrayList<>(); list5.add("Harry"); list5.add("Tony"); list5.add("Tom"); list5.add("Jerry"); …… …snip… …… ArrayList<String> list1000 = new ArrayList<>(); list1000.add("Harry"); list1000.add("Tony"); list1000.add("Tom"); list1000.add("Jerry"); System.out.println(System.currentTimeMillis()); } }
Test2編譯后生成的.class列表為:
Test2.class
只生成了1個.class文件
運行時間
第一段代碼Test1運行結果:
1508379452224
1508379452784
運行時間為:560毫秒
第二段代碼Test2運行結果:
1508379671505
1508379671507
運行時間為:2毫秒
雖然說這個時間差距會根據電腦性能以及運行狀態有所變化,但也能說明雙大括號初始化方法要比常規方法用時長
綜上,(測試初始化數據較少(list未達到自增臨界點)的情況下)雙大括號初始化方法要比常規方法效率低:
1. 雙大括號初始化方法生成的.class文件要比常規方法多
2. 雙大括號初始化方法運行時間要比常規方法長
感謝各位的閱讀,以上就是“Java中雙大括號初始化怎么使用”的內容了,經過本文的學習后,相信大家對Java中雙大括號初始化怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。