去哪网网站设计风格,吉林省网站制作公司有哪些,一个公司网站设计需求,永久免费库存管理软件ConcurrentModificationException并发修改异常
原因分析
可以通过遍历索引也可以通过迭代器进行遍历。在我们使用迭代器进行遍历集合的时候#xff0c;会获取到当前集合的迭代对象。在里面有封装了迭代器的remove方法与集合自带的remove方法#xff0c;如果我们调用迭代器对…ConcurrentModificationException并发修改异常
原因分析
可以通过遍历索引也可以通过迭代器进行遍历。在我们使用迭代器进行遍历集合的时候会获取到当前集合的迭代对象。在里面有封装了迭代器的remove方法与集合自带的remove方法如果我们调用迭代器对象的remove方法是没问题的但是当我们调用集合自带的remove方法时就会产生ConcurrentModificationException 并发修改异常。也就是说当我们通过非迭代器进行遍历集合的时候是不允许集合本身在结构上发生变化的。 增删操作会导致 预期数量和 计数器的数量不一致,就会导致并发修改异常
解决方式
1ListIterator列表迭代器list特有的迭代器将添加、删除元素交给迭代器去做而非集合
ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(B);
list.add(C);ListIteratorString stringListIterator list.listIterator();
while (stringListIterator.hasNext()) {String element stringListIterator.next();if(StringUtils.equals(element,C)) {// 在遍历时向列表中添加元素stringListIterator.add(D);}
}
System.out.println(list);//[A, B, B, C, D]2普通for循环删除时需要从后往前删除,因为从前往后删除可能会漏删删除第一个B之后索引到2但是本来索引2的元素第二个B却来到了索引1的位置
ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(B);
list.add(C);for (int i list.size()-1; i 0; i--) {if(StringUtils.equals(list.get(i),B)) {list.remove(B);}
}System.out.println(list);3使用CopyOnWriteArrayList集合底层解决并发修改异常就可以使用集合的增删方法在遍历时操作
ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(B);
list.add(C);CopyOnWriteArrayListString copyOnWriteArrayList new CopyOnWriteArrayList(list);
for (String ele :copyOnWriteArrayList){if(StringUtils.equals(ele,C)) {// 在遍历时向列表中添加元素copyOnWriteArrayList.add(D);}
}System.out.println(copyOnWriteArrayList);//[A, B, B, C, D]4当遍历时需要删除元素时可以使用普通迭代器普通迭代器没有新增方法
ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(B);
list.add(C);
//普通迭代器,只能删除,没有add
IteratorString iterator list.iterator();
while (iterator.hasNext()){String next iterator.next();if(StringUtils.equals(next,B)) {iterator.remove();//迭代器删除第一个B然后hasNext拉到下一个B迭代器再删除一次}
}
System.out.println(list);//[A, C]5增强for循环底层采用迭代器遍历时删除(新增)只能用集合的删除(新增)方法还会报并发修改异常
ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(B);
list.add(C);for (String element : list) {//Caused by: java.util.ConcurrentModificationException: nullif(StringUtils.equals(element,B)) {list.add(B);}
}
System.out.println(list);//[A, B, B, C, D]