ArrayList<String> strList = new ArrayList<String>();
strList.add("1");
strList.add("4");
strList.add("4");
strList.add("2");
strList.add("5");
strList.add("5");
strList.add("7"); Iterator<String> it = strList.iterator();

while (it.hasNext()) {
String str = it.next();

if (str.equals("4") || str.equals("2")) {
it.remove();


if (str.equals("5")) {
it.remove();
strList.add("9");//这里出现ConcurrentModificationException异常
}


}把其中的“5”改成“9”,怎么会有这个异常!

解决方案 »

  1.   

    如果实在没办法 换成 CopyOnWriteArrayList
      

  2.   

    迭代的时候不能执行添加,或删除操作
    strList.add("9");
      

  3.   

    正解!
    要想实现操作,可以用一个临时的list来存放值,不能对迭代的list进行删除操作
      

  4.   

    楼上的正解
    迭代的时候不能执行添加、删除操作,该list是被同步了的
    list可以不用迭代,直接循环的
      

  5.   


     List<String> list=(List<String>) strList.clone();
            for(String str:list){
                if (str.equals("4")) 
                 strList.remove("4");
                else if(str.equals("2"))
                 strList.remove("4");
                if (str.equals("5")) {
                 strList.remove("5");
                 strList.add("9");
                }
            }
            System.out.println(strList);
      

  6.   

    用Iterator遍历List的时候是不允许使用List的add和remove方法的,看看源代码就知道了,主要是因为一个cursor变量需要在迭代的时候变化。可以考虑使用ListIterator,它自身具有添加删除方法。....
    ListIterator<String> it = strList.listIterator();
    ...
    if (str.equals("5")) {
         it.remove();
         it.add("9");//OK
    }
      

  7.   

    从设计上考虑,如果允许集合在Iterator被创建之后,集合结构上的非Iterator机制内的改动,
    Iterator是对其做应变好还是不应变好?应变的话,Iterator与集合之间须是实时联动,可能通过观察者模式的机制,(可能代价较高),能否让迭代顺利进行,这一点我相信能做到,因为其支持Iterator本身的add remove操作不应变的话,就会挑战一致性,这个更严重,因此宁愿设定迭代时外界不可更改,这个虽然加少了一定适应性,但是换来的是性能和更高的可操作性(只提供Iterator本身的结构修改)