遍歷刪除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