亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

德阳市| 绥芬河市| 桐梓县| 云林县| 瑞金市| 昭觉县| 安西县| 肇庆市| 景东| 莒南县| 朝阳市| 绿春县| 嘉荫县| 禄丰县| 霍邱县| 岑巩县| 沾化县| 门头沟区| 南阳市| 成武县| 古丈县| 旬阳县| 墨玉县| 江源县| 六枝特区| 独山县| 大关县| 辽阳市| 江北区| 通江县| 西丰县| 滦南县| 长治县| 正蓝旗| 东辽县| 玉树县| 远安县| 图片| 合山市| 伊春市| 宁陕县|