Rumah >Java >javaTutorial >Cara membetulkan: Ralat Koleksi Java: Pengecualian traversal koleksi

Cara membetulkan: Ralat Koleksi Java: Pengecualian traversal koleksi

PHPz
PHPzasal
2023-08-25 23:48:221765semak imbas

Cara membetulkan: Ralat Koleksi Java: Pengecualian traversal koleksi

Cara menyelesaikan: Ralat Koleksi Java: Pengecualian Traversal Koleksi

Pengenalan:
Dalam pembangunan Java, koleksi adalah struktur data yang sangat biasa digunakan untuk menyimpan dan memanipulasi set data. Walau bagaimanapun, apabila menggunakan koleksi untuk operasi traversal, pengecualian traversal koleksi sering ditemui. Artikel ini menerangkan punca dan penyelesaian masalah ini, dan menyediakan contoh kod yang sepadan.

1. Punca pengecualian traversal koleksi:
Apabila kami menggunakan iterator atau untuk setiap gelung untuk melintasi koleksi, jika koleksi diubah suai semasa proses traversal (seperti menambah atau memadam elemen), pengecualian ConcurrentModificationException akan dilemparkan. Ini kerana, semasa proses traversal, iterator atau untuk setiap gelung akan mengekalkan pembilang untuk mengesan sama ada struktur koleksi telah berubah dan akan membuang pengecualian sebaik sahaja perubahan ditemui.

2. Penyelesaian:

  1. Gunakan Iterator untuk melintasi koleksi, dan gunakan kaedah remove() Iterator untuk memadamkan elemen semasa proses traversal. Contohnya adalah seperti berikut:
List<String> list = new ArrayList<>();
// 添加元素
list.add("A");
list.add("B");
list.add("C");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    if (item.equals("B")) {
        iterator.remove(); // 删除元素
    }
}
  1. Apabila menggunakan gelung normal untuk melintasi koleksi, anda boleh menggunakan kaedah remove() List untuk memadam elemen, dan anda perlu melintasi koleksi dalam susunan terbalik untuk mengelakkan perubahan dalam indeks. Contohnya termasuk:
List<String> list = new ArrayList<>();
// 添加元素
list.add("A");
list.add("B");
list.add("C");

for (int i = list.size() - 1; i >= 0; i--) {
    String item = list.get(i);
    if (item.equals("B")) {
        list.remove(i); // 删除元素
    }
}
  1. Gunakan kelas koleksi serentak seperti ConcurrentHashMap atau CopyOnWriteArrayList, yang membenarkan koleksi diubah suai semasa traversal tanpa membuang pengecualian. Contohnya adalah seperti berikut:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
// 添加元素
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    if (entry.getValue() == 2) {
        map.remove(entry.getKey()); // 删除元素
    }
}

Kesimpulan:
Pengecualian traversal koleksi disebabkan oleh pengubahsuaian koleksi semasa proses traversal. Untuk menyelesaikan masalah ini, kita boleh menggunakan Iterator untuk melintasi koleksi dan menggunakan kaedah remove(), gunakan gelung normal for untuk melintasi koleksi dan gunakan kaedah remove() List, atau gunakan kelas koleksi serentak. Memilih penyelesaian yang sesuai boleh mengelakkan masalah pengecualian traversal kutipan dengan berkesan dan memastikan operasi normal program.

Jumlah bilangan perkataan: 437 perkataan

Atas ialah kandungan terperinci Cara membetulkan: Ralat Koleksi Java: Pengecualian traversal koleksi. 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