在 Java 中迭代集合时如何避免 ConcurrentModificationException?
javaobject oriented programmingprogramming
当您使用集合对象时,当一个线程正在迭代特定集合对象时,如果您尝试从中添加或删除元素,则会抛出 ConcurrentModificationException。
不仅如此,如果您正在迭代集合对象,向其中添加或删除元素并尝试再次迭代其内容,则认为您正在尝试使用多个线程访问集合对象,并且会抛出 ConcurrentModificationException。
示例
import java.util.ArrayList; import java.util.Iterator; public class OccurenceOfElements { public static void main(String args[]) { ArrayList <String> list = new ArrayList<String>(); //实例化 ArrayList 对象 list.add("JavaFX"); list.add("Java"); list.add("WebGL"); list.add("OpenCV"); System.out.println("Contents of the array list (first to last): "); Iterator<String> it = list.iterator(); while(it.hasNext()) { System.out.print(it.next()+", "); } //list.remove(3); list.add(3, "Hadoop"); while(it.hasNext()) { System.out.print(it.next()+", "); } } }
输出
Contents of the array list (first to last): JavaFX, Java, WebGL, OpenCV, Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at sample.OccurenceOfElements.main(OccurenceOfElements.java:23)
要在从多个线程访问集合对象时解决此问题,请使用同步块或方法,并且如果您在检索数据时修改数据,请在修改数据后再次获取 Iterator 对象。
示例
import java.util.ArrayList; import java.util.Iterator; public class OccurenceOfElements { public static void main(String args[]) { ArrayList <String> list = new ArrayList<String>(); //实例化 ArrayList 对象 list.add("JavaFX"); list.add("Java"); list.add("WebGL"); list.add("OpenCV"); System.out.println("Contents of the array list (first to last): "); Iterator<String> it = list.iterator(); while(it.hasNext()) { System.out.print(it.next()+". "); } list.remove(3); System.out.println(""); System.out.println("Contents of the array list after removal: "); it = list.iterator(); while(it.hasNext()) { System.out.print(it.next()+". "); } } }
输出
Contents of the array list (first to last): JavaFX. Java. WebGL. OpenCV. Contents of the array list after removal: JavaFX. Java. WebGL.