Rumah > Java > javaTutorial > 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
Lepaskan: 2024-11-14 22:14:02
asal
924 orang telah melayarinya

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

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

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

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();
}
Salin selepas log masuk
Salin selepas log masuk
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
...
Salin selepas log masuk

Iterator

List<Integer> a = new ArrayList<>();
for (Iterator<Integer> iterator = a.iterator(); iterator.hasNext();) {
  Integer integer = iterator.next();
  integer.toString();
}
Salin selepas log masuk
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
...
Salin selepas log masuk

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!

sumber:php.cn
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