中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中雙大括號初始化怎么使用

發布時間:2022-06-20 15:13:30 來源:億速云 閱讀:154 作者:iii 欄目:開發技術

這篇文章主要講解了“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
&hellip;&hellip;
&hellip;snip&hellip;
&hellip;&hellip;
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中雙大括號初始化怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南溪县| 肃宁县| 娱乐| 高州市| 德清县| 米脂县| 新干县| 达孜县| 延寿县| 柳江县| 盐亭县| 嘉祥县| 石柱| 西藏| 开江县| 桂平市| 广丰县| 睢宁县| 英吉沙县| 民勤县| 沙洋县| 东丽区| 呼图壁县| 寻乌县| 陕西省| 乌审旗| 公安县| 长海县| 新化县| 普安县| 沛县| 永安市| 哈密市| 商洛市| 阳原县| 平江县| 清流县| 驻马店市| 大方县| 思南县| 兴安县|