最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中雙大括號初始化的理解與使用

 更新時間:2022年06月20日 11:27:50   作者:不如一默  
最近重讀Java 編程思想,讀到有關(guān)實例化代碼塊兒的內(nèi)容,使我對于使用兩個大括號進行初始化有了更深的理解,下面這篇文章主要給大家介紹了關(guān)于Java中雙大括號初始化的理解與使用的相關(guān)資料,需要的朋友可以參考下

偶然機會看到一種對象初始的方式:

    // 新建一個列表,并賦值 "Harry","Tony","Tom"
    ArrayList<String> friends = new ArrayList<String>() {{
        add("Harry");
        add("Tony");
        add("Tom");
    }};

當(dāng)然,對Map集合也用同種初始化方式:

    // 新建一個Map,并賦值
    Map<String, Object> cat = new HashMap<String, Object>() {{
        put("name", "Tom");
        put("age", 10);
    }};

這里利用了內(nèi)部類語法,這種方式比先new出對象然后再進行依次add要方便、簡潔許多。該方法稱之為“雙括號初始化”(double brace initialization)。

對該方法的理解

以ArrayList的初始化為例,第一層花括號,首先對定義了一個繼承自ArrayList的匿名內(nèi)部類

    ArrayList<String> friends = new ArrayList<String>() {
        // 這里什么操作都沒有,全部繼承自父類(ArrayList)
    };

第二層則是一個自定義的對象構(gòu)造塊(稱之為 非靜態(tài)初始化塊)

    new ArrayList<String>() {
        // 這里什么操作都沒有,全部繼承自父類(ArrayList)
    };

我們通過new得到ArrayList的子類的實例化,然后上轉(zhuǎn)型為ArrayList的引用

    ArrayList<String> friends = new ArrayList<String>() {{}};
  • 我們得到的 friends 實際上是ArrayList的子類的引用,但在功能上沒有任何改變
  • 相比于常規(guī)標準方式進行初始化要簡潔許多(但代碼可讀性相對會差)

效率問題

利用雙大括號初始化集合從效率上來說可能不如標準的集合初始化步驟。原因在于使用雙大括號初始化會導(dǎo)致內(nèi)部類文件的產(chǎn)生,而這個過程就會影響代碼的執(zhí)行效率。

首先查看不同初始化方式生成的.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運行結(jié)果:

1508379452224
1508379452784

運行時間為:560毫秒

第二段代碼Test2運行結(jié)果:

1508379671505
1508379671507

運行時間為:2毫秒

雖然說這個時間差距會根據(jù)電腦性能以及運行狀態(tài)有所變化,但也能說明雙大括號初始化方法要比常規(guī)方法用時長

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

1. 雙大括號初始化方法生成的.class文件要比常規(guī)方法多

2. 雙大括號初始化方法運行時間要比常規(guī)方法長

總結(jié)

到此這篇關(guān)于Java中雙大括號初始化的理解與使用的文章就介紹到這了,更多相關(guān)Java雙大括號初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java并發(fā)之Phaser的全面解析詳解

    Java并發(fā)之Phaser的全面解析詳解

    Phaser是Java中一個靈活的同步工具,其優(yōu)點在于支持多階段的任務(wù)拆分與同步,并且能夠動態(tài)地注冊與注銷參與者,下面我們就來深入了解一下Phaser的應(yīng)用吧
    2024-02-02
  • Java 堆內(nèi)存溢出原因分析

    Java 堆內(nèi)存溢出原因分析

    這篇文章主要介紹了Java 堆內(nèi)存溢出原因分析,任何使用過基于 Java 的企業(yè)級后端應(yīng)用的軟件開發(fā)者都會遇到過這種報錯,java.lang.OutOfMemoryError:Java heap space。,需要的朋友可以參考下
    2019-06-06
  • SpringBoot+vue+Axios實現(xiàn)Token令牌的詳細過程

    SpringBoot+vue+Axios實現(xiàn)Token令牌的詳細過程

    Token是在服務(wù)端產(chǎn)生的,前端可以使用用戶名/密碼向服務(wù)端請求認證(登錄),服務(wù)端認證成功,服務(wù)端會返回?Token?給前端,Token可以使用自己的算法自定義,本文給大家介紹SpringBoot+vue+Axios實現(xiàn)Token令牌,感興趣的朋友一起看看吧
    2023-10-10
  • Java讀取OpenSSL生成的PEM公鑰文件操作

    Java讀取OpenSSL生成的PEM公鑰文件操作

    這篇文章主要介紹了Java讀取OpenSSL生成的PEM公鑰文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • SpringBoot詳解整合MyBatis過程中可能遇到的問題

    SpringBoot詳解整合MyBatis過程中可能遇到的問題

    因為Spring Boot框架開發(fā)的便利性,所以實現(xiàn)Spring Boot與數(shù)據(jù)訪問層框架(例如MyBatis)的整合非常簡單,主要是引入對應(yīng)的依賴啟動器,并進行數(shù)據(jù)庫相關(guān)參數(shù)設(shè)置即可
    2022-07-07
  • 整理總結(jié)Java多線程程序編寫的要點

    整理總結(jié)Java多線程程序編寫的要點

    這篇文章主要介紹了Java多線程程序編寫的要點,包括線程的狀態(tài)控制和優(yōu)先級以及線程的通信問題等方面,非常之全面!需要的朋友可以參考下
    2016-01-01
  • Java8新特性之lambda的作用_動力節(jié)點Java學(xué)院整理

    Java8新特性之lambda的作用_動力節(jié)點Java學(xué)院整理

    我們期待了很久lambda為java帶來閉包的概念,但是如果我們不在集合中使用它的話,就損失了很大價值?,F(xiàn)有接口遷移成為lambda風(fēng)格的問題已經(jīng)通過default methods解決了,在這篇文章將深入解析Java集合里面的批量數(shù)據(jù)操作解開lambda最強作用的神秘面紗。
    2017-06-06
  • java的finalize方法解讀

    java的finalize方法解讀

    這篇文章主要介紹了java的finalize方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • RepeatSubmit若依框架如何防止表單重復(fù)提交注解

    RepeatSubmit若依框架如何防止表單重復(fù)提交注解

    若依框架中的@RepeatSubmit注解用于防止表單重復(fù)提交,通過在控制器方法上添加該注解,并在前端頁面和JavaScript代碼中實現(xiàn)雙重校驗,可以確保同一用戶在短時間內(nèi)不會重復(fù)提交相同的表單
    2024-11-11
  • Java中的System類、BigInteger類和BigDecimal類詳解

    Java中的System類、BigInteger類和BigDecimal類詳解

    這篇文章主要介紹了Java中的System類、BigInteger類和BigDecimal類詳解,arraycopy()方法,復(fù)制數(shù)組元素,比較適合底層調(diào)用,一般使用Arrays.copyOf()完成復(fù)制數(shù)組,需要的朋友可以參考下
    2023-09-09

最新評論

仁寿县| 泽普县| 汾西县| 东丰县| 钦州市| 寿宁县| 滁州市| 榆林市| 嘉黎县| 巩义市| 新兴县| 遂宁市| 寿宁县| 辛集市| 黎平县| 霍林郭勒市| 江孜县| 商水县| 谢通门县| 裕民县| 红原县| 甘肃省| 安陆市| 华坪县| 达拉特旗| 梅河口市| 梅河口市| 砚山县| 古交市| 琼海市| 元氏县| 同江市| 马龙县| 石屏县| 南川市| 大港区| 海伦市| 栾城县| 兴和县| 边坝县| 杭州市|