import java.util.*;public class test{
  public static void main(String args[]){
     List<String> li=new ArrayList<String>();
     li.add("hello");
     li.add("world");
     li.add("ok");
        Iterator<String> t=li.iterator();
        while(t.hasNext()){
            String s=t.next();
            if(s=="ok"){
                t.remove();
                   //这边不能用容器li.remove(s);来删除容器里面的元素;
                   
                   //请问如果用li来调用List的其他方法可不可以?会不会出错?
            }
        }
        System.out.println(li);
  }
}

解决方案 »

  1.   

    那里不要用 ==,用equals.因为string是引用类型,==比较的是引用的地址。。
      

  2.   

    java.util包里的这些Collection在迭代的时候用collection本身来进行remove肯定会抛异常相反,java.util.concurrent包里的Collection则不会有这些问题
      

  3.   

    ArrayList不是线程安全的,Iterator里面有计数器,你再其他地方删除了,就会抛出Exception.
      

  4.   

    你在遍历一个List的时候是不可以进行增删操作的。也就是说,你一旦开始遍历List,那么这个List在遍历期间他的长度是不可以修改的。你一定要实现你的目的,给你个方案:
    1)把ArrayList改成Vector
    2)如果不改,那么你新建一个List,备份原来的,然后在备份的List中进行删除
    也就是:List<String> bak = new ArrayList<String>(li);你在for里面要remove的时候,用
    bak.remove(s);
      

  5.   

    除了iterator自身的remove和add方法,其它任何想要改变集合结构的方式都会抛出ConcurrentModificationException
      

  6.   

    我使用你的方法可以删掉啊!import java.util.*;public class test{
    public static void main(String args[]){
    List<String> li=new ArrayList<String>();
    li.add("hello");
    li.add("world");
    li.add("ok");
    li.add("okg");
      Iterator<String> t=li.iterator();
      while(t.hasNext()){
      String s=t.next();
      if(s.equals("ok")){
      t.remove();
      //这边不能用容器li.remove(s);来删除容器里面的元素;
       
      //请问如果用li来调用List的其他方法可不可以?会不会出错?
     }
      }
      System.out.println(li);
    }
    }[code=Java]
    [/code]
      

  7.   

    lz应该了解一下equals和==的区别了,呵呵!!
      

  8.   

    import java.util.*;class Student{
    int number;
    String name;
    double grade;
    public Student(int number,String name,double grade){
    this.number=number;
    this.name=name;
    this.grade=grade;
    }
    public String toString(){
    return "number:"+number+" name:"+name+" grade:"+grade;
    }
    }  public class test{
    public static void main(String args[]){
    List<Student> li=new ArrayList<Student>();
    li.add(new Student(1,"A",80));
    li.add(new Student(2,"B",70));
    li.add(new Student(3,"C",60));
      Iterator<Student> t=li.iterator(); //注释处
      while(t.hasNext()){
      Student s=t.next();
      if(s.number == 1){
       t.remove();
       continue;
      }

      System.out.println(s);
      }
    }
    }
    这样就ok了
      

  9.   

    诚邀 :编程高手 加入 问问团队——编程狂,地址:http://wenwen.soso.com/t/t260701.htm
      

  10.   


    涉及到添加,删除,更新的操作,都不能在迭代过程中使用。不能用容器li.remove(s);这种抛异常ConcurrentModificationException可以不用Iterator!!
      

  11.   

    list中可以用for循环实现嘛li.size()然后用li.get(index)得到,最后再equals比较删除
      

  12.   

    我建议用Foreach循环。当然也可以直接在底层ArrayList下直接删除!
      

  13.   

    你可以把iterator看成指针,这个指针用来遍历list中的所有元素,并且由它来操作list中的每个元素,而不是由list本身来操作的。
      

  14.   

    关于本帖的java基础Iterator接口的问题,让我明白了java基础是不可以随便丢掉的。
      

  15.   

    我这里有个儿例子和楼主是一样的。在iterator里面是可以删除的。我使用的是jdk1.6.
    我以前用c#写的时候不能删除,只能使用for来删除
    public class MyIterator { public static void main(String[] args){
    List list = new ArrayList();
    list.add("1111");
    list.add("2222");
    list.add("3333");
    list.add("4444");
    list.add("5555");
    Iterator ite = list.iterator();
    System.out.println("before iterator size is "+list.size());
    while(ite.hasNext()){
    String str = (String)ite.next();
    if(str.equals("2222")){
    System.out.println("enter this method!");
    ite.remove();
    }
    }

    System.out.println("after iterator size is "+list.size());
    }
    }