例如:
public class IteratorDemo{
public static void main(String[] args){
Collection books=new HashSet();
books.add("a");
books.add("b");
Iterator it=books.iterator();
while(it.hasNext()){
String book=(String) it.next();
if(book.equals("b")){
books.remove(book);//使用Iterator迭代过程中,不可修改集合元素,此句代码异常
it.remove();//从集合中删除上一次next()返回的元素
}
book="c";//对迭代变量进行赋值,但集合里的元素不会改变。因此,当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何改变。
}
}
}
上面这种错误在多线程编程时尤其容易发生:程序的一条线程正在迭代访问Collection集合元素时,另一条线程修改了Collection集合,这就会导致发生异常。
注意:这里所谓的“从集合中删除上一次next()返回的元素就是指 if(book.equals("b"))中的b,即这里就是将b从集合中删除。
除了使用Iterator迭代访问Collection集合之外,JDK1.5提供的foreach循环来迭代访问集合元素更加便捷。
例如:上面代码可改为
public class ForeachDemo{
public static void main(String[] args){
Collection books=new HashSet();
books.add("a");
books.add("b");
for(object obj:books){
String book=(String) obj;//此处的book变量本身也不是集合元素本身,只是存放集合元素的值
if(book.equals("b")){
books.remove(book);//此处与上面类似,也会引发ConcurrentModificationException异常
}
}
}