Rumah  >  Artikel  >  Java  >  Adakah Terdapat Perbezaan Prestasi Antara Menggunakan Gelung Untuk-Setiap dan Iterator untuk Traversal Koleksi di Jawa?

Adakah Terdapat Perbezaan Prestasi Antara Menggunakan Gelung Untuk-Setiap dan Iterator untuk Traversal Koleksi di Jawa?

DDD
DDDasal
2024-11-14 22:14:02898semak imbas

Is There a Performance Difference Between Using a For-Each Loop and an Iterator for Collection Traversal in Java?

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!

Kenyataan:
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