并发修改异常
并发修改异常: ConcurrentModificationException
产生原因: 迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
解决方案: 用for循环遍历,然后用集合对象做对应的操作即可
并发修改异常的练习
xxxxxxxxxx
package ch14;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
需求:
1、有一个集合:List<String> list = new ArrayList<String>();
2、里面有三个元素:hello、world、java
3、遍历集合,得到每一个元素,如果有world这个元素,就添加一个javaee元素,用代码实现
*/
public class a_9_1测试 {
public static void main(String[] args) {
//创建集合对象
List<String> list = new ArrayList<String>(); //选中List,按Ctrl+B,查看源码。再选中ArrayList看一下源码
//添加元素
list.add("hello");
list.add("world");
list.add("java");
//遍历集合,得到每一个元素,如果有world这个元素,就添加一个javaee元素
/*Iterator<String> it = list.iterator(); //这种遍历方法会报错。先注释,建议用最下面的for循环遍历方式
while (it.hasNext()){
String s = it.next(); //不要用next方法获取元素
if(s.equals("world")){ //equals是字符串方法,比较的是字符串的内容,返回布尔值
list.add("javaee");
}
}*/
//输出集合对象
//System.out.println(list); //为什么会报错呢,ConcurrentModificationException。这里报错先注释,需要自己解开
//该异常继承自RuntimeException,即运行时异常
//异常原因:当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常
//去‘a_9_2并发修改异常的源码分析.txt’里面看原因,总结到那里去了
//---------------------------------------------------------------------------------------------------------------
//解决方法,如下
//原理:遍历循环对于List集合,不建议使用迭代器的方式。要想不抛出并发异常,就使用for循环遍历方式
for(int i=0; i<list.size(); i++){
String s = list.get(i); //建议用get方法获取元素
if(s.equals("world")){ //equals是字符串方法,比较的是字符串的内容,返回布尔值
list.add("javaee");
}
}
System.out.println(list);
//优点:保证线程安全
}
}