Penelusuran ArrayList
| English | Bahasa Indonesia |
|---|---|
| ConcurrentModificationException/kənˈkʌrənt ˌmɒdɪfɪˈkeɪʃn ekˈsepʃn/ | ConcurrentModificationException |
Pilih traversal yang sesuai dengan perubahan yang ditargetkan
- Sebuah ArrayList berisi [2, 3, 4]. Anda ingin menggandakan setiap nilai yang disimpan, sambil mempertahankan jumlah elemen tetap tidak berubah.
- Loop bertanda indeks dapat menggunakan list.set(i, 2 * list.get(i)). Menetapkan x = 2*x dalam for (int x : list) hanya mengubah variabel loop lokal.
Dimulai dari list [2, 3, 4], jalankan for (int x : list) { x = 2 * x; }. Berapakah list.get(1)?
Penugasan pada primitive lokal x tidak menggantikan Integer yang tersimpan. Elemen tengah daftar tetap 3.
Perulangan di atas daftar
- Traverse ArrayList sama seperti array, tetapi dengan metodenya. Bertanda indeks:
for (int i = 0; i < list.size(); i++) { ... list.get(i) ... } - For-each:
for (String s : list) { ... s ... }— bersih untuk membaca nilai.size()(bukanlength*) membatasi loop bertanda indeks.
Pola yang sama
- Jumlah, hitungan, min/maks, dan pencarian bekerja sama seperti dengan array. Cukup tukar
a[i]menjadilist.get(i)dana.lengthmenjadilist.size(). - Akumulator dan logika max/count identik. Semua yang Anda pelajari untuk penelusuran array berlaku juga di sini.
Membaca vs. memodifikasi
- Loop ditingkatkan menyalin nilai setiap elemen ke dalam variabel loop-nya. Untuk
Integerelemen yang dibaca sebagaiint x, penugasan kextidak akan mengganti elemen daftar; loop terindeks dapat menggantinya denganset(i, x). - Untuk perubahan struktural (menambah/menghapus), gunakan loop terindeks dengan hati-hati. Pembacaan itu sederhana; menghapus selama perulangan memerlukan perhatian ekstra (pelajaran berikutnya).
Menjumlahkan ArrayList berdasarkan indeks
Dibatasi dengan size(), dibaca dengan get(i) (list = [10,20,30]).
Kondisi yang benar untuk loop indexed ArrayList adalah...
ArrayList menggunakan size(); array menggunakan length.
Why should a program avoid direct structural changes during an ArrayList enhanced-for traversal?
ArrayList fail-fast behaviour is best-effort. Avoid unsafe traversal rather than relying on a guaranteed exception.
Pola penelusuran array (jumlah, hitungan, maks) bekerja sama untuk ArrayList.
Cukup ganti a[i]/a.length dengan list.get(i)/list.size().
Untuk menghapus elemen dengan aman saat menelusuri list, Anda harus menggunakan...
for-each tidak bisa memodifikasi struktur; loop indexed bisa (dengan hati-hati).
Tanpa modifikasi struktural selama traversal, loop ditingkatkan dapat membaca semua entri dari ArrayList
Loop membaca setiap referensi yang disimpan. Perubahan struktural selama traversal adalah perhatian terpisah; klaim ini tidak menjamin semua operasi pada setiap elemen yang mungkin aman.
Jangan modifikasi selama for-each
- Menambah atau menghapus selama loop for-each dapat memicu ConcurrentModificationException; deteksi fail-fast bersifat upaya terbaik. Loop for-each mengasumsikan daftar tidak berubah struktur di bawahnya.
- Untuk menghapus saat menelusuri, gunakan loop terindeks (dan kelola indeksnya). Membaca dengan for-each cocok jika daftar tidak diubah secara struktural selama penelusuran. Juga periksa persyaratan elemen: unboxing Integer null tetap melempar pengecualian.
Batasi loop ArrayList terindeks dengan list.size(), bukan .length, dan jangan pernah mengubah struktur selama for-each. Memanggil add/remove di dalam for (x : list) dapat memicu ConcurrentModificationException, tetapi deteksinya tidak dijamin. Untuk menghapus saat menelusuri, gunakan loop terindeks — dan ingat remove(i) menggeser elemen yang lebih belakang, jadi jangan buta i++ melewati elemen yang bergeser.
After the indexed doubling update, what is list.get(1)?
The middle stored value 3 is replaced by 6. Reassigning a primitive loop variable would leave it at 3.
Untuk entri Student non-null, s.addScore(5) di dalam for (Student s : students) dapat mengubah siswa yang tersimpan tanpa menambah atau menghapus elemen daftar.
Referensi salinan mencapai objek Student yang dapat diubah. Medan mereka dapat berubah tanpa mengubah struktur daftar.
Menjumlahkan ArrayList
- Terindeks:
for (int i = 0; i < list.size(); i++) { sum += list.get(i); } - For-each:
for (int x : list) { sum += x; }(autoboxing/unboxing menangani Integer↔int). - Keduanya menjumlahkan list; for-each lebih bersih untuk read-only.
Terapkan penalaran ke kasus baru
- Menambah atau menghapus langsung selama traversal ditingkatkan tidak aman; pengecualian fail-best adalah upaya terbaik, bukan pemeriksaan kebenaran yang dijamin.
- Daftar objek Student yang dapat diubah dapat ditelusuri dengan
for (Student s : students) { s.addScore(5); }, dengan asumsi entri non-null. Ini mengubah state setiap objek tanpa mengubah struktur daftar; menugaskan referensi berbeda kestidak akan mengganti elemen yang disimpan.
Telusuri ArrayList dengan loop terindeks (i < list.size(), list.get(i)) atau loop ditingkatkan yang menerima nilai setiap elemen. Pola array (jumlah, hitungan, min/maks, pencarian) semuanya berlaku. Hindari perubahan struktural langsung selama traversal ditingkatkan: ConcurrentModificationException mungkin mendeteksi kesalahan, tetapi tidak dijamin. Gunakan loop terindeks yang dikelola dengan hati-hati untuk pola penghapusan yang diajarkan pada pelajaran berikutnya; mengubah field objek yang dirujuk berbeda dari mengubah struktur daftar.