使用迭代器遍历集合的时候是不可以修改元素的,不然就会报错java.util.ConcurrentModificationException (并发修改异常)
详细请看下面的例子:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Exception {
//使用迭代器时出现的问题以及解决方法
/*
* 问题: 遍历一个集合:判断;里面是否有一个hello这个字符串,如果有就再添加一个javaee
*
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建集合对象
List list = new ArrayList() ;
list.add("hello");
list.add("world");
list.add("i'am");
list.add("java");
//迭代器遍历
// Iterator it = list.iterator();
// while(it.hasNext()){
// String s = (String) it.next() ;
// if(s.equals("hello")){
//
// list.add("javaee");
}
}
/*
* 测试后发现直接报错,但是程序的逻辑没有问题
java.util.ConcurrentModificationException (并发修改异常)
产生原因: 迭代器是依赖集合而存在的,但是在遍历的过程中我们添加了元素,但是迭代器不知道集合已经改变了,所以就报错了
原因总结: 使用迭代器的时候不可以用结合修改元素
解决方法:1. 使用数组遍历,用集合添加元素
结果你会发现这个是添加在集合的结尾
2.使用迭代器遍历,用迭代器添加元素
这个你会发现是添加在hello后面
3我自己的方法
*/
//使用集合遍历,并且用集合添加元素
// Object[] obj = list.toArray();
// for(int i= 0 ; i< obj.length ;i++){
//
// String s = (String) obj[i];
// if(s.equals("hello")){
// list.add("javaee");
// }
//
// }
//使用迭代器遍历,使用迭代器添加元素 但是Iterator并没有修改方法,所以要用他的子类ListIterator
ListIterator it = list.listIterator();
while(it.hasNext()){
String s = (String) it.next();
if(s.equals("hello")){
it.add("javaee");
}
}
//我自己的方法解决方法:
// Iterator it = list.iterator();
// boolean b = false ;
// while(it.hasNext()){
//
// String s = (String) it.next() ;
// if(s.equals("hello")){
//
// //list.add("javaee");
// b= true ;
// }
// }
// if(b== true){
// list.add("javaee");
// }
Iterator it2 = list.iterator();
// while(it2.hasNext()){
//
// String s = (String) it2.next() ;
// System.out.println(s);
// }
}
}