package misc;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class TestListRemove {    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
            String str = "td" + i;
            list.add(str);
        }        for (Iterator it = list.iterator(); it.hasNext();) {
            String str = (String) it.next();//这里会报错
            System.out.println(str);
            if (str.equals("td9")) {
                 list.remove(str);  // td9应该是最后一个元素
            }
        }
    }
}
td9是list里最后一个元素,删完它,程序就应该退出循环了,但我跟踪了一下,发现又进入循环了,执行String str = (String) it.next(),这是怎么回事?

解决方案 »

  1.   

    list.remove(str) 应该换成 it.remove()吧
      

  2.   


    package misc;import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;public class TestListRemove {    public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            for (int i = 0; i < 10; i++) {
                String str = "td" + i;
                list.add(str);
            }
            Iterator it = list.iterator(); //
            while (it.hasNext()) {  //用while吧
                String str = (String) it.next();//这里会报错
                System.out.println(str);
                if (str.equals("td9")) {
                     list.remove(str);  // td9应该是最后一个元素
                }
            }
        }
    }
      

  3.   

    首先,你的代码是不安全的。在遍历List的时候还要去删除元素,很容易出现并发异常。这个不建议使用。非要使用,你可以用一个备份List操作
      

  4.   

    while (it.hasNext()) {  
                String str = (String) it.nex();//报java.util.ConcurrentModificationException异常
                System.out.println(str);
                if (str.equals("td9")) {
                     list.remove(str);  
                }
            }
    ConcurrentModificationException:某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不明确的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险
      

  5.   

    在遍历集合的时候修改或者删除集合里面的对象会抛出ConcurrentModificationException的。
      

  6.   

    你最后的元素删完了还调用it.hasNext(),当然就空指针了。建议使用while().
      

  7.   

    今天第二个在iterator遍历中作删除的人。用for(int i=0;i<list.size();i++)遍历吧,想怎么删由你
      

  8.   


    // 删除操作应该用迭代器的remove方法,否者会抛出异常。改成如下写法就OK了。        List<String> list = new ArrayList<String>();
            for (int i = 0; i < 10; i++) {
                String str = "td" + i;
                list.add(str);
            }        for (Iterator it = list.iterator(); it.hasNext();) {
                String str = (String) it.next();
                System.out.println(str);
                if ("td9".equals(str)) {
                    // list.remove(str);  // td9应该是最后一个元素
                    it.remove();  // 改动点。
                }
            }
      

  9.   

    up,这种迭代的循环一般都用while
      

  10.   

    list.remove(str);应该为it.remove();
      

  11.   

    顶 9楼.....  备份一个不就可以了,而且不会 抛出ConcurrentModificationException        for (Iterator it = new ArrayList<String>(list).iterator(); it.hasNext();) {
                String str = (String) it.next();
                System.out.println(str);
                if (str.equals("td9")) {
                     list.remove(str); 
                }
            }
      

  12.   

    Iterator 迭代时!相当于同步锁将它锁住!在迭代时是不能对迭代对象进行任何改动的!
      

  13.   

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;public class TestListRemove {    public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            for (int i = 0; i < 10; i++) {
                String str = "td" + i;
                list.add(str);
            }
            if(list.contains("td9")){
             list.remove("td9");
            }
            Iterator it = list.iterator(); //
            while (it.hasNext()) {  //用while吧
                String str = (String) it.next();//这里会报错
                System.out.println(str);
            }
        }
    }
      

  14.   


    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;public class TestListRemove {    public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            for (int i = 0; i < 10; i++) {
                String str = "td" + i;
                list.add(str);
            }
            if(list.contains("td9")){
             list.remove("td9");
            }
            Iterator it = list.iterator(); //
            while (it.hasNext()) {  //用while吧
                String str = (String) it.next();//这里会报错
                System.out.println(str);
            }
        }
    }
      

  15.   

    建议楼主看看APIimport java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;public class TestListRemove {    public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            for (int i = 0; i < 10; i++) {
                String str = "td" + i;
                list.add(str);
            }
            if(list.contains("td9")){
             list.remove("td9");
            }
            Iterator it = list.iterator(); //
            while (it.hasNext()) {
                String str = (String) it.next();
                System.out.println(str);
            }
        }
    }
      

  16.   

    同意三楼的做法,这是最安全的,备份一个List,然后遍历原来的那个list,把其中符合你要求的元素add到备份的List中去
      

  17.   

    在用Iterator去取集合元素的过程中(如Map、List),禁止使用集合本身的remove方法删除元素,用Iterator的 remove()方法代替
     否则会报异常java.util.ConcurrentModificationException。
      

  18.   

    这段代码我稍作了修改List<String> list = new ArrayList<String>();
            for (int i = 0; i < 10; i++) {
                String str = "td" + i;
                list.add(str);
            }        for (String temp:list) {
                System.out.println(temp);
                if ("td9".equals(temp)) {
                    temp=null;
                }
            }
      

  19.   

    使用iterator遍历容器的时候其内部会执行锁定,所以你再用list。remove(str)操作时没有任何作用的,相反其代码也存在安全隐患。只能使用it.remove()