Hari ini saya dengan senang hati membuat kode ketika saya mendapatkan sepotong kode yang sudah saya gunakan ratusan kali:
Iterasi melalui Koleksi (di sini ArrayList)
Untuk beberapa alasan, saya benar-benar melihat opsi pelengkapan otomatis Eclipse dan itu membuat saya bertanya-tanya:
Kasus apa yang lebih baik digunakan loop berikut daripada yang lain?
Loop indeks array klasik:
for (int i = 0; i < collection.length; i++) {
type array_element = collection.get(index);
}
Iterator hasNext () / next ():
for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
type type = (type) iterator.next();
}
Dan favorit saya karena sangat mudah untuk menulis:
for (iterable_type iterable_element : collection) {
}
java
collections
for-loop
Jason Rogers
sumber
sumber
for (Iterator<type> iterator = collection.iterator(); iterator.hasNext();) { type type = iterator.next(); }
Jawaban:
Yang pertama berguna saat Anda membutuhkan indeks elemen juga. Ini pada dasarnya sama dengan dua varian lainnya untuk
ArrayList
s, tetapi akan sangat lambat jika Anda menggunakan fileLinkedList
.Yang kedua berguna ketika Anda tidak membutuhkan indeks elemen tetapi mungkin perlu menghapus elemen saat Anda mengulang. Tapi ini memiliki kelemahan karena IMO terlalu bertele-tele.
Versi ketiga adalah pilihan saya juga. Ini singkat dan berfungsi untuk semua kasus di mana Anda tidak memerlukan indeks atau iterator yang mendasarinya (yaitu Anda hanya mengakses elemen, tidak menghapusnya atau memodifikasi dengan
Collection
cara apa pun - yang merupakan kasus paling umum).sumber
Collection
murah untuk diambil dengan indeks).List
diterapkan sebagai pohon, sebenarnya akan lebih lambat).Semuanya memiliki kegunaannya sendiri:
Jika Anda memiliki iterable dan perlu melintasi tanpa syarat ke semuanya:
untuk (iterable_type iterable_element: collection)
Jika Anda memiliki iterable tetapi perlu melintasi secara kondisional:
untuk (Iterator iterator = collection.iterator (); iterator.hasNext ();)
Jika struktur data tidak menerapkan iterable:
untuk (int i = 0; i <collection.length; i ++)
sumber
break
dan / ataucontinue
Ada juga koleksi 'stream () util dengan Java 8
atau
Informasi lebih lanjut tentang aliran Java 8 dan tautan koleksi untuk keajaiban
sumber
Tak satu pun dari mereka yang "lebih baik" dari yang lain. Yang ketiga, bagi saya, lebih mudah dibaca, tetapi bagi seseorang yang tidak menggunakan foreaches ini mungkin terlihat aneh (mereka mungkin lebih suka yang pertama). Ketiganya cukup jelas bagi siapa saja yang memahami Java, jadi pilih mana yang membuat Anda merasa lebih baik tentang kodenya.
Yang pertama adalah yang paling dasar, jadi ini adalah pola paling universal (berfungsi untuk array, semua iterable yang dapat saya pikirkan). Itulah satu-satunya perbedaan yang dapat saya pikirkan. Dalam kasus yang lebih rumit (misalnya Anda perlu memiliki akses ke indeks saat ini, atau Anda perlu memfilter daftar), kasus pertama dan kedua mungkin lebih masuk akal. Untuk kasus sederhana (objek yang dapat diulang, tidak ada persyaratan khusus), yang ketiga tampaknya yang paling bersih.
sumber
Opsi pertama adalah kinerja yang lebih baik (Karena ArrayList mengimplementasikan antarmuka RandomAccess). Sesuai dengan dokumen java, implementasi List harus mengimplementasikan antarmuka RandomAccess jika, untuk instance kelas yang khas, loop ini:
berjalan lebih cepat dari loop ini:
Saya harap ini membantu. Opsi pertama akan lambat untuk daftar akses berurutan.
sumber
Berikut ini contohnya
sumber