Rumah >Java >javaTutorial >Cara menggunakan pemula pendakap berganda dalam Java

Cara menggunakan pemula pendakap berganda dalam Java

WBOY
WBOYke hadapan
2023-04-18 11:13:021371semak imbas

Secara kebetulan, saya melihat cara untuk memulakan objek:

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

Sudah tentu, kaedah permulaan yang sama juga digunakan untuk koleksi Peta:

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

Di sini kita gunakan sintaks kelas dalam, kaedah ini lebih mudah dan ringkas daripada memperbaharui objek dahulu dan kemudian menambahnya secara berurutan. Kaedah ini dipanggil "pemulaan pendakap berganda" (pemulaan pendakap berganda).

Pemahaman kaedah ini

Ambil pemulaan ArrayList sebagai contoh Lapisan pertama pendakap kerinting mula-mula mentakrifkan kelas dalam tanpa nama yang diwarisi daripada ArrayList

    ArrayList<String> friends = new ArrayList<String>() {
        // 这里什么操作都没有,全部继承自父类(ArrayList)
    };

The. lapisan kedua ialah blok pembinaan objek tersuai (dipanggil blok permulaan bukan statik)

    new ArrayList<String>() {
        // 这里什么操作都没有,全部继承自父类(ArrayList)
    };

Kami mendapat instantiasi subkelas ArrayList melalui baharu, dan kemudian naikkan ke dalam rujukan kepada ArrayList

    ArrayList<String> friends = new ArrayList<String>() {{}};
  • Rakan yang kami dapat sebenarnya merujuk kepada subkelas ArrayList, tetapi tiada perubahan dalam fungsi berbanding

  • Ia lebih mudah untuk memulakan dengan cara standard konvensional (tetapi kebolehbacaan kod agak lemah)

Isu kecekapan

Adalah mungkin untuk menggunakan pendakap berganda untuk memulakan koleksi dari segi kecekapan Tidak sebaik langkah permulaan pengumpulan standard. Sebabnya ialah menggunakan pendakap kerinting berganda untuk permulaan akan membawa kepada penjanaan fail kelas dalaman, dan proses ini akan menjejaskan kecekapan pelaksanaan kod.

Mula-mula semak fail .class yang dijana oleh kaedah permulaan yang berbeza

Sebagai contoh, kod berikut:

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());
    }
}

Senarai .class yang dijana selepas Test1 disusun ialah:

Test1$1.class
Test1$2.class
Test1$3.class
Test1$4.class
Test1$5.class
……
…snip…
……
Test1$1000.class
Test1.class

1001 .class fail telah dijana

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());
    }
}

Test1. telah disusun Senarai .class ialah:

Test2.class

Hanya 1 fail .class dijana

Masa berjalan

Pertama Hasil larian kod Test1:

1508379452224
1508379452784

Masa berjalan ialah: 560 milisaat

1508379671505

1508379671507

Masa berjalan ialah: 2 milisaat

Walaupun kali ini bergantung pada komputer prestasi dan status operasi, Tetapi ia juga menunjukkan bahawa kaedah pemula pendakap berganda mengambil masa lebih lama daripada kaedah konvensional

Ringkasnya, (apabila data permulaan ujian kurang (senarai belum mencapai titik kritikal kenaikan automatik )) kaedah pemula pendakap berganda lebih panjang daripada kaedah konvensional Kaedah konvensional tidak cekap:

1 Kaedah pemula pendakap berganda menjana lebih banyak fail kelas daripada kaedah konvensional

2. Kaedah permulaan pendakap berganda mengambil masa lebih lama untuk dijalankan berbanding kaedah konvensional

Atas ialah kandungan terperinci Cara menggunakan pemula pendakap berganda dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam