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

Cara menggunakan pemula pendakap berganda dalam Java

WBOY
Lepaskan: 2023-04-18 11:13:02
ke hadapan
1365 orang telah melayarinya

Secara kebetulan, saya melihat cara untuk memulakan objek:

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

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);
    }};
Salin selepas log masuk

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)
    };
Salin selepas log masuk

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

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

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

    ArrayList<String> friends = new ArrayList<String>() {{}};
Salin selepas log masuk
  • 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());
    }
}
Salin selepas log masuk

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());
    }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan