Rumah  >  Artikel  >  Java  >  Bagaimana untuk menangani ConcurrentModificationException di Java?

Bagaimana untuk menangani ConcurrentModificationException di Java?

王林
王林asal
2023-06-25 08:31:431698semak imbas

Bagaimana untuk berurusan dengan ConcurrentModificationException di Java?

Dalam pengaturcaraan Java, ConcurrentModificationException ialah pengecualian yang sangat biasa. Pengecualian ini sering berlaku apabila kita menggunakan iterator (Pelajar) atau gelung untuk dipertingkatkan (foreach) untuk menggelung melalui koleksi. Artikel ini akan memperkenalkan sebab dan penyelesaian pengecualian ini.

  1. Punca pengecualian

Apabila kita menggunakan iterator untuk melintasi koleksi, jika elemen dalam koleksi diubah suai (ditambah, dipadamkan, dll.) semasa proses traversal, pengecualian ConcurrentModificationException akan dilemparkan. Sebab pengecualian ini ialah apabila kaedah Iterator seterusnya() dipanggil, ia akan membandingkan sama ada modCount semasa adalah sama dengan expectedModCount Jika ia tidak sama, ia bermakna koleksi telah berubah semasa proses lelaran, iaitu , apabila kami menambah atau memadam pada elemen koleksi, nilai modCount akan ditukar, tetapi nilai expectedModCount tidak akan berubah, menyebabkan kedua-duanya tidak sama rata, dan pengecualian ConcurrentModificationException akan dibuang. .

Menggunakan gelung biasa untuk melintasi ialah penyelesaian yang boleh dilaksanakan kerana kami boleh mengendalikan elemen dalam koleksi melalui subskrip dan bukannya menggunakan iterator. Walau bagaimanapun, kaedah ini lebih menyusahkan untuk digunakan dan memerlukan jumlah kod yang lebih besar.
  1. Kod contoh:
  2. List<String> list = new ArrayList<>();
    for(int i = 0; i < list.size(); i++) {
        String str = list.get(i);
        // 对str进行操作
    }
(2) Gunakan kaedah alih keluar Iterator

Jika kita mesti mengubah suai elemen semasa melintasi koleksi, maka kita boleh menggunakan kaedah alih keluar Iterator untuk melaksanakan operasi pemadaman. Kaedah ini boleh digunakan untuk memadamkan elemen yang dikembalikan oleh panggilan terakhir ke kaedah next() tanpa membuang ConcurrentModificationException.

Contoh kod:

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String str = it.next();
    if(str.equals("hello")) {
        it.remove();
    }
}

(3) Menggunakan CopyOnWriteArrayList

CopyOnWriteArrayList ialah koleksi selamat-benang. Ciri pemisahan baca-tulisnya memastikan bahawa apabila kami menambah atau memadam elemen pada koleksi, ia tidak akan menjejaskan traversal semasa . Apabila elemen berubah, CopyOnWriteArrayList mencipta salinan baharu data dan kemudian beroperasi padanya. Oleh itu, CopyOnWriteArrayList sesuai untuk senario di mana terdapat lebih banyak bacaan dan kurang penulisan.

Kod sampel:

List<String> list = new CopyOnWriteArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String str = it.next();
    if(str.equals("hello")) {
        list.remove(str);
    }
}

Di atas adalah kaedah biasa yang kami gunakan untuk mengelakkan pengecualian ConcurrentModificationException. Dalam pengaturcaraan sebenar, untuk memastikan keteguhan dan kecekapan program, kita perlu memilih kaedah berdasarkan situasi sebenar.

Atas ialah kandungan terperinci Bagaimana untuk menangani ConcurrentModificationException di Java?. 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