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.
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.List<String> list = new ArrayList<>(); for(int i = 0; i < list.size(); i++) { String str = list.get(i); // 对str进行操作 }
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 CopyOnWriteArrayListCopyOnWriteArrayList 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!