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(); } }
List<String> list = new CopyOnWriteArrayList<>(); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next(); if(str.equals("hello")) { list.remove(str); } }
Atas ialah kandungan terperinci Bagaimana untuk menangani ConcurrentModificationException di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!