遍历删除list元素java.util.ConcurrentModificationException:
- 错误的做法
for(MtMakeOrderVO temp : mtMakeOrderVOS){
if(temp.getMyDate() == null){
mtMakeOrderVOS.remove(temp);
}
}
// 报错信息如下
java.util.ConcurrentModificationException: null
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
private static void removeEle02() {
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
System.out.println(list.size());
}
// 删除元素后,下标变化了。 删除第一个元素导致第二个元素的下标变了。
如下 可以使用的几种遍历方式
- 最好使用 Iterator 吧
private static void removeEle04() {
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(list);
for (String str : cowList) {
if ("aa".equals(str)) {
cowList.remove(str);
}
}
System.out.println(cowList.size());
}
private static void removeEle03() {
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = (String)it.next();
if("aa".equals(str)){
it.remove();
}
}
System.out.println(list.size());
}
private static void removeEle01() {
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
for (int i = list.size() - 1; i >= 0; i--) {
String str = list.get(i);
if ("aa".equals(str)) {
list.remove(str);
}
}
System.out.println(list.size());
}
先记录下 …
探究其原理 可参考
https://blog.csdn.net/qq_40718168/article/details/94546317