Java中的ConcurrentModificationException是一种运行时异常,它表示在使用迭代器(Iterator)遍历集合(例如List、Set、Map等)时,针对集合的某些操作导致了集合的结构发生了修改,从而导致迭代器状态不一致的异常。
具体来说,如果在使用迭代器遍历集合时,另外一个线程改变了集合的结构(比如添加、删除元素等),那么正在遍历的线程就会遇到ConcurrentModificationException异常。这是因为在使用迭代器遍历集合时,Java会通过modCount(集合结构的修改次数)来检测是否修改了集合的结构,如果检测到了结构发生了变化,就会抛出该异常。
下面给出两个示例说明ConcurrentModificationException:
(1)遍历List时删除元素:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
for (String s : list) {
if (s.equals("B")) {
list.remove(s);
}
}
在上面的代码中,使用for-each循环遍历了一个List,并在遍历时尝试删除了元素B。由于删除操作修改了集合的结构,因此会抛出ConcurrentModificationException异常。如果想避免该异常,可以使用Iterator进行遍历和删除,而非使用for-each循环。
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.equals("B")) {
iterator.remove();
}
}
(2)遍历Map时删除元素:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
for (String key : map.keySet()) {
if (key.equals("B")) {
map.remove(key);
}
}
在上面的代码中,使用for-each循环遍历了一个Map,并在遍历时尝试删除了key为B的元素。由于删除操作修改了集合的结构,因此会抛出ConcurrentModificationException异常。如果想避免该异常,可以使用Iterator进行遍历和删除,而非使用for-each循环。
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
if (key.equals("B")) {
iterator.remove();
}
}
总之,Java中的ConcurrentModificationException异常是由于多个线程并发访问同一个集合,而在迭代集合时有添加或删除元素操作,导致了集合的结构发生了修改,从而迭代器的状态不一致而抛出的异常。解决该问题的方法是使用Iterator进行遍历和删除。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的ConcurrentModificationException是什么? - Python技术站