Rumah > Java > javaTutorial > teks badan

Bagaimanakah Saya Boleh Mengelakkan ConcurrentModificationException Apabila Mengulangi Koleksi di Java?

Linda Hamilton
Lepaskan: 2024-11-27 15:31:10
asal
577 orang telah melayarinya

How Can I Avoid ConcurrentModificationException When Iterating Over Collections in Java?

Pengecualian Pengubahsuaian Serentak dalam Java

Apabila bekerja dengan aplikasi berbilang benang atau mengulangi koleksi di Java, adalah penting untuk mengelakkan pengubahsuaian serentak. Pengubahsuaian serentak merujuk kepada melakukan perubahan pada koleksi semasa pengubah sedang giat mengulangi koleksi yang sama.

Pertimbangkan coretan kod berikut untuk menggambarkan isu ini:

import java.util.*;

public class SomeClass {
    public static void main(String[] args) {
        List<String> s = new ArrayList<>();
        ListIterator<String> it = s.listIterator();

        for (String a : args)
            s.add(a);

        if (it.hasNext())
            String item = it.next();

        System.out.println(s);
    }
}
Salin selepas log masuk

Kod ini cuba mengulangi atas senarai menggunakan ListIterator. Walau bagaimanapun, pengecualian pengubahsuaian serentak boleh berlaku jika elemen baharu ditambahkan pada senarai (s.add(a)) semasa iterator (ia) sedang digunakan untuk melintasi senarai.

Untuk menyelesaikan isu ini, Java menyediakan iterator yang gagal-cepat. Setiap kali iterator cuba mengakses koleksi, ia menyemak sama ada koleksi telah ditukar melebihi akses awal iterator itu. Jika koleksi diubah suai dalam apa jua cara di luar titik akses iterator, pengecualian ConcurrentModificationException akan dilemparkan.

Coretan kod dikemas kini yang mengelakkan pengecualian pengubahsuaian serentak diberikan di bawah:

import java.util.*;

public class SomeClass {
    public static void main(String[] args) {
        List<String> s = new ArrayList<>();

        for(String a : args)
            s.add(a);

        ListIterator<String> it = s.listIterator();    
        if(it.hasNext()) {  
            String item = it.next();   
        }  

        System.out.println(s);
    }
}
Salin selepas log masuk

Adalah penting untuk diingat bahawa ListIterator tidak mampu mengenal pasti pengubahsuaian yang berlaku sebelum iterator dibuat, hanya pengubahsuaian yang berlaku semasa iterator sedang digunakan. Selain itu, iterator tidak menghalang pengubahsuaian serentak daripada berlaku, sebaliknya mengesannya dan membuang pengecualian apabila ia berlaku. Untuk mengelakkan pengubahsuaian serentak sepenuhnya, mekanisme penyegerakan harus digunakan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengelakkan ConcurrentModificationException Apabila Mengulangi Koleksi di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan