在开发的过程中,我们经常会对集合中的元素进行操作,改变集合的内容可能会产生ConcurrentModificationException异常,本文对该异常进行详细的分析。
可能一些同学看到过fail-fast或者fail-safe的概念,如果不了解的可以点击:
fail-fast(快速失败)和fail-safe(安全失败)
ConcurrentModificationException异常分析
先来看一段代码:
import java.util.ArrayList;
import java.util.List;
/**
* @author Huangqing
* @date 2018/7/25 16:37
*/
public class IteratorTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("goudan");
list.add("mafei");
list.add("lubenwei");
for (String s : list) {
if (s.equals("lisi")) {
list.remove(s);
}
}
}
}
执行结果:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.hq.iteratorTest.IteratorTest.main(IteratorTest.java:19)
上面代码主要是对删除集合中的某一元素,很多刚接触Java的同学在学习集合的时候,了解到remove(obj)方法,通过该方法删除掉集合中的元素。
我们先来看一下remove(obj)方法的源码(以ArrayList为例)
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
</