Kata pengantar
Alasan untuk memperkenalkan Loop yang Ditingkatkan: Dalam versi JDK5 sebelumnya, lebih merepotkan untuk melintasi elemen dalam array atau koleksi dan iterator dari panjang atau koleksi array.
Sintaks baru didefinisikan dalam JDK5 - ditingkatkan untuk loop untuk menyederhanakan operasi tersebut. Ditingkatkan untuk loop hanya dapat digunakan pada array atau koleksi yang mengimplementasikan antarmuka Iterable.
Format Sintaks:
untuk (variabel tipe variabel: array atau koleksi yang perlu diulang) {
}
Di Java, melintasi koleksi dan array umumnya memiliki tiga bentuk berikut:
untuk (int i = 0; i <list.size (); i ++) {System.out.print (list.get (i)+",");} iterator iterator = list.iterator (); while (iterator.hasnext ()) {System.out.print (iterator.next () + ",");} untuk (integer i: list) {System.out.print (i + ",");} Yang pertama adalah biasa untuk loop traversal, yang kedua adalah menggunakan iterator untuk traversal, dan yang ketiga umumnya disebut ditingkatkan untuk loop (untuk masing -masing).
Prinsip Implementasi
Dapat dilihat bahwa bentuk ketiga adalah gula sintaksis yang disediakan oleh Java. Di sini kami menganalisis bagaimana peningkatan loop ini diimplementasikan di lapisan yang mendasarinya.
Kami mendekompilasi kode berikut:
for (integer i: list) {System.out.println (i);}Setelah dekompilasi:
Integer i; for (iterator iterator = list.iterator (); iterator.hasnext (); System.out.println (i)) {i = (integer) iterator.next (); } Kode yang didekompilasi sebenarnya cukup rumit, jadi mari kita hancurkan dalam urutan eksekusi:
Integer I; mendefinisikan variabel sementara i
Iterator iterator = list.iterator (); Dapatkan Iterator Daftar
iterator.hasnext (); Menentukan apakah ada elemen yang tidak diangkut di iterator
i = (integer) iterator.next (); Dapatkan elemen yang tidak diangkut pertama dan tetapkan ke variabel sementara i
System.out.println (i) mengeluarkan nilai variabel sementara i
Siklus ini sampai semua elemen dalam daftar dilalui.
Melalui dekompilasi, kita melihat bahwa lapisan yang ditingkatkan untuk loop di Java sebenarnya diimplementasikan melalui pola iterator.
Lubang meningkatkan loop untuk
Ini dikatakan sebagai lubang dalam peningkatan loop, tetapi sebenarnya terutama karena beberapa orang dapat masuk ke dalam lubang dalam prinsip implementasi peningkatan untuk loop.
Karena peningkatan loop diimplementasikan melalui iterator, ia harus memiliki karakteristik iterator.
Ada mekanisme gagal-cepat di Java. Saat menggunakan iterator untuk melintasi elemen, Anda harus berhati -hati saat menghapus koleksi. Jika Anda menggunakannya secara tidak benar, ConcurrentModificationException dapat terjadi. Ini adalah pengecualian runtime dan tidak akan terjadi selama periode kompilasi. Ini hanya akan meledak saat program benar -benar berjalan.
Seperti dalam kode berikut:
untuk (siswa Stu: Siswa) {if (stu.getId () == 2) Siswa.remove (Stu); }Pengecualian ConcurrentModification Exception akan dilemparkan.
Iterator bekerja di utas terpisah dan memiliki kunci mutex. Setelah iterator dibuat, tabel indeks tautan tunggal yang menunjuk ke objek asli. Ketika jumlah objek asli berubah, konten dari tabel indeks ini tidak akan berubah secara serempak, jadi ketika pointer indeks bergerak mundur, objek untuk mengulangi tidak dapat ditemukan, jadi sesuai dengan prinsip gagal-cepat, iterator akan segera dilemparkan.
Java.util.concurrentModificationException Exception.
Oleh karena itu, Iterator tidak mengizinkan objek iterasi diubah saat berfungsi.
Tetapi Anda dapat menggunakan metode iterator sendiri remove() untuk menghapus objek. Metode Iterator.remove() akan mempertahankan konsistensi indeks sambil menghapus objek iterasi saat ini.
Hapus elemen dengan benar saat melintasi:
Iterator <shonish> Stuiter = student.iterator (); while (STUITER.HASNEXT ()) {Student Student = STUITER.NEXT (); if (student.getId () == 2) STUITER.REMOVE (); // Di sini Anda perlu menggunakan metode hapus iterator untuk menghapus objek saat ini. Jika Anda menggunakan metode Hapus Daftar, ConcurrentModificationException juga akan muncul} Oke, di sini saya akan memperkenalkan Anda pada prinsip implementasi untuk meningkatkan loop untuk dan jebakan yang mungkin Anda alami jika Anda menggunakannya secara tidak benar. Oleh karena itu, meskipun itu adalah sintaks yang sederhana untuk setiap, Anda juga harus memahami prinsip-prinsipnya, jika tidak, ia dapat menyebabkan beberapa masalah yang tidak dapat dijelaskan.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.