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).
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)
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
1508379671505Masa berjalan ialah: 2 milisaatWalaupun 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 konvensional1508379671507
Atas ialah kandungan terperinci Cara menggunakan pemula pendakap berganda dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!