ConcurrentModificationException并发修改异常
在遍历的时候会出现的并发修改异常,一下是我遇到的两种
一.集合迭代器删除添加元素出现并发修改异常
将集合中的"Java"字符串删除
import java.util.ArrayList;
import java.util.Iterator;
/**
* @Author: Administrator
* @CreateTime: 2019-01-12 13:01
*/
public class Demo2 {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("ab");
arrayList.add("java");
arrayList.add("java");
arrayList.add("java");
System.out.println(arrayList);
Iterator<String> iterator = arrayList.iterator();
while(iterator.hasNext()){
String s = iterator.next();
if("java".equals(s)){
//arrayList.set(arrayList.indexOf(s),"helloworld");
arrayList.remove(s);
}
}
System.out.println(arrayList);
}
}
解决方法:
1,不用迭代器,用for循环遍历,用集合的arrayList.add()和arrayList.remove()方法
2,用迭代器自带的iterator.remove();方法
二.新式for循环删除元素出现并发修改异常
删除集合中重复出现的元素,在递归用新式for循环由于新式for循环本身计算索引,所以删除元素,出现了并发修改异常.
import java.util.ArrayList;
/**
* @Author: Administrator
* @CreateTime: 2019-01-12 12:50
*/
public class Demo {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("abc");
arrayList.add("a");
arrayList.add("abc");
arrayList.add("ab");
arrayList.add("a");
arrayList.add("abc");
arrayList.add("ab");
ArrayList arrayList1 = digui(arrayList);
System.out.println(arrayList1);
}
//递归将重复元素删除
//如果从前往后找,和从后往前找的索引不一致,证明有相同元素.然后将其中之一删除.
private static ArrayList digui(ArrayList<String> arrayList) {
for (String s : arrayList) {
if (arrayList.indexOf(s) != arrayList.lastIndexOf(s)) {
arrayList.remove(s);
//return digui(arrayList);
digui(arrayList);
}
}
return arrayList;
}
}
解决方法1:就是加上将digui(arrayList);改为return digui(arrayList);每次将循环结束掉
解决方法2:用旧式for循环, .size()计算索引,不由系统计算.
谢谢!