Untuk Setiap Gelung vs. Iterator: Kecekapan dalam Traversal Koleksi
Pengenalan
Apabila melintasi koleksi di Jawa, pilihan timbul antara menggunakan gelung untuk setiap satu dan lelaran. Artikel ini meneroka perbezaan kecekapan antara kedua-dua pendekatan ini.
Untuk-Setiap Gelung
Diperkenalkan dalam Java 5, gelung untuk setiap (juga dikenali sebagai yang dipertingkatkan untuk gelung) ialah sintaks ringkas dan mudah dibaca untuk mengulangi koleksi. Ia menggunakan iterator secara dalaman:
List<Integer> a = new ArrayList<>(); for (Integer integer : a) { integer.toString(); }
Iterator
Penyalur menyediakan antara muka piawai untuk mengulang koleksi. Ia membenarkan kawalan tersuai ke atas proses traversal.
List<Integer> a = new ArrayList<>(); for (Iterator<Integer> iterator = a.iterator(); iterator.hasNext();) { Integer integer = iterator.next(); integer.toString(); }
Perbandingan Kecekapan
Untuk akses baca sahaja mudah kepada koleksi, hampir tiada perbezaan prestasi antara untuk setiap gelung dan pendekatan iterator. Gelung untuk setiap satu secara dalaman menggunakan mekanisme lelaran.
Walau bagaimanapun, jika menggunakan gelung "gaya-c" tradisional dengan get(i):
for (int i = 0; i < list.size(); i++) { Object o = list.get(i); }
Pendekatan lelaran (kedua-duanya untuk -setiap gelung dan lelaran eksplisit) boleh menjadi jauh lebih cekap untuk struktur data tertentu. Contohnya, dalam senarai terpaut, get(i) ialah operasi O(n). Menggunakan operasi O(1) next() iterator memastikan gelung berjalan dalam masa O(n), manakala gelung get(i) akan berjalan dalam masa O(n2).
Perbandingan Bytecode
Untuk mengesahkan bahawa bagi setiap gelung menggunakan mekanisme iterator, kita boleh membandingkan bytecode yang dijana untuk kedua-dua pendekatan:
Untuk-Setiap Gelung
List<Integer> a = new ArrayList<>(); for (Integer integer : a) { integer.toString(); }
ALOAD 1 INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator; ASTORE 3 ...
Iterator
List<Integer> a = new ArrayList<>(); for (Iterator<Integer> iterator = a.iterator(); iterator.hasNext();) { Integer integer = iterator.next(); integer.toString(); }
ALOAD 1 INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator; ASTORE 2 ...
Seperti yang anda boleh perhatikan, bytecode yang dijana adalah sama, menunjukkan tiada penalti prestasi dalam menggunakan mana-mana pendekatan.
Kesimpulan
Ringkasnya, apabila merentasi koleksi untuk akses baca sahaja, perbezaan antara untuk setiap gelung dan lelaran adalah minimum . Iterator hanya menawarkan kelebihan apabila bekerja dengan struktur data tertentu atau memerlukan tingkah laku lelaran tersuai. Untuk kesederhanaan dan kebolehbacaan, gelung untuk setiap setiap adalah pilihan yang diutamakan.
Atas ialah kandungan terperinci Adakah Terdapat Perbezaan Prestasi Antara Menggunakan Gelung Untuk-Setiap dan Iterator untuk Traversal Koleksi di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!