for :和iterator.next()是一个东西吗,他们有什么区别没?大侠看看下面的代码第一种:
public static void removeEvensVer2( List<Integer> lst>
{
  for(Integer x : lst)
            if(x%2==0)
                 lst.remove(x);
}第二种:
public static void removeEvensVer2( List<Integer> lst>
{
  Iterator<Integer> itr = lst.iterator();
  while(itr.hasNext())
            if(x%2==0)
                 itr.remove(x);
}如果上面有区别,能帮我详细解释一下吗,谢谢先。:-)

解决方案 »

  1.   

    可以使用 for each 循环的 实现了 Iterable接口 
    public interface java.lang.Iterable{
        public abstract java.util.Iterator iterator();
    }
      

  2.   


    /**
     * 
     */
    package o;import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;/**
     * @author Administrator
     * 
     */
    public class MyJava
    { public static void main(String[] args)
    { List lst = new LinkedList();
    lst.add(6);
    lst.add(5);
    lst.add(1);
    lst.add(4);
    lst.add(2);

    removeEvensVer2(lst);
    // removeEvensVer3(lst);
    } public static void removeEvensVer2(List<Integer> lst)
    {
    for (Integer x : lst)
    if (x % 2 == 0)
    lst.remove(x);

    System.out.println(lst); 
    } public static void removeEvensVer3(List<Integer> lst)
    {
    Iterator<Integer> itr = lst.iterator();
    while (itr.hasNext())
    if (itr.next() % 2 == 0)
    itr.remove();

    System.out.println(lst); 
    }}removeEvensVer2抛异常,removeEvensVer3正常,为什么呢?
      

  3.   

    Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
    at java.util.LinkedList$ListItr.next(Unknown Source)
    at o.MyJava.removeEvensVer2(MyJava.java:33)
    at o.MyJava.main(MyJava.java:27)
      

  4.   

    两者都用于遍历··前者可以使用在任何的有序遍历中··后者仅适用于遍历有序的容器··如··List··
      

  5.   

    假如你把你的代码
    改成下面的代码
             Integer even;
            while (itr.hasNext())
                if ((even = itr.next()) % 2 == 0){
                 lst.remove(even);你将会看到一样的异常报出。
    问题在于对List做遍历的时候修改了List,而不在于for:和Iterator的差别。for:确实是在利用Iterator做事情,和直接用Iterator没有太大差别。
      

  6.   

    LinkedList的API:
    此类的 iterator 和 listIterator 方法返回的迭代器是快速失败 的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。 for (Integer x : lst)
                if (x % 2 == 0)
                    lst.remove(x);//这里是调用list的remove,不是迭代器的remove
            
      

  7.   

    看看jdk源码就知道了,迭代器和集合中改变次数不一致就会thorw new java.util.ConcurrentModificationException()
      

  8.   


    +1 正解!for循环增强形式,在对数组、容器都可使用
    而Iterator只能在容器中使用
      

  9.   

    注意了,类集内的变量也就是你的1st删除的话,它会破坏集合的原有结构的!这样删除必定出错
    所以我们都用迭代删除也就是Iterator
      

  10.   

        第一种是FOR循环简单遍历的一种方式,此方法很少用到,只有在只做简单的循环时才有用!
         第二种  迭代器,通常只要实现了ConnlCollection下Integer接口的类都能使用,
               通常我们将Integer写成一个固定的类或方法进行调用!
      

  11.   

    无疑 Java 开发人员很喜爱 Java 集合 Iterator,但是您最后一次使用 Iterator 接口是什么时候的事情了?可以这么说,大部分时间我们只是将 Iterator 随意放到 for() 循环或加强 for() 循环中,然后就继续其他操作了。
    但是进行深入研究后,您会发现 Iterator 实际上有两个十分有用的功能。
    第一,Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException,这个异常顾名思意:当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的 remove() 方法是个安全的做法。
    第二,Iterator 支持派生的(并且可能是更强大的)兄弟成员。ListIterator,只存在于 List 中,支持在迭代期间向 List 中添加或删除元素,并且可以在 List 中双向滚动。
    双向滚动特别有用,尤其是在无处不在的 “滑动结果集” 操作中,因为结果集中只能显示从数据库或其他集合中获取的众多结果中的 10 个。它还可以用于 “反向遍历” 集合或列表,而无需每次都从前向后遍历。插入 ListIterator 比使用向下计数整数参数 List.get() “反向” 遍历 List 容易得多。