黑马程序员技术交流社区

标题: Iterator与增强for循环的关系是什么呢? [打印本页]

作者: 任亚俊    时间: 2013-12-22 22:46
标题: Iterator与增强for循环的关系是什么呢?
Iterator与增强for循环的区别是什么呢?
什么时候用Iterator好,什么时候用增强for循环好呢?

作者: 一年之后    时间: 2013-12-22 23:16
增强For循环只用于获取集合中的元素,不能操作元素。
而Iterator可以操作元素,remove(),移除元素
如果用ListIterator 可以对元素进行增删改查操作。

如果你只是获取元素,就用增强for循环

如果你想在迭代的时候,操作元素,就用Iterator或ListIterator
作者: 任亚俊    时间: 2013-12-22 23:24
一年之后 发表于 2013-12-22 23:16
增强For循环只用于获取集合中的元素,不能操作元素。
而Iterator可以操作元素,remove(),移除元素
如果用Li ...

谢谢,学习了。
作者: 恩恩    时间: 2013-12-22 23:41
增强for循环只是用来便利一个集合的元素,并不是用来操作一个集合的,它的作用是更方便的便利一个集合,或者说把程序语言写的更简单一点,举个例子,如下:
int[] arr=new int[5];
     for(int i=0;i<5;i++)
     arr=i+1;//给数组中各元素赋值
        for(int j=0;j<arr.length;j++)
     System.out.println(arr[j]);

/////////////////////////////////////////////
int[] arr=new int[5];
     for(int i=0;i<5;i++)
     arr=i+1;//给数组中各元素赋值
        for(int a:arr)
     System.out.println(a);
这上面两个代码完成的是一样的工作,但是底下的这一个有什么好处呢,在增强的for循环中,我们不需要去检查数组的边界,不必担心数组下标越界。这个问题我想肯定很多人都遇到多了,我也是一样。
作者: smileven    时间: 2013-12-23 02:58
增强for循环只能用来对元素进行遍历,不能获取元素并进行操作。
而且是定义一个要遍历元素同类型的引用,从头开始移动到末尾处。
如果只是遍历元素,那么就用增强for循环。
  1. File[] files = File.listRoots();
  2.                 for(File f : files)
  3.                         System.out.println(f);
复制代码

而Iterator迭代器不仅可以对元素进行便利,还可以获取某一个元素并对其进行操作。
迭代器的遍历是根据hasNext()的返回值来判断是否遍历完。
如果想要获取元素并进行相应的操作,就用迭代器。
  1. public static void main(String[] args)
  2.         {
  3.                 //定义集合并添加元素
  4.                 TreeSet ts = new TreeSet();
  5.                 ts.add(new Student("lisi02",22));
  6. Iterator it = ts.iterator();
  7.                 while (it.hasNext())
  8.                 {
  9.                         Student stu = (Student)it.next();
  10.                         System.out.println(stu.getName()+"----"+stu.getAge());
  11.                 }
  12.         }
复制代码




作者: 恨死我了    时间: 2013-12-23 09:54
1.首先增强for循环和iterator遍历的效果是一样的,也就说
增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容,不能获取下标等。
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator。
以下例子证明第一点
①     public static void removeEventsDemo1(List<Integer> lst)
    {
        for (Integer x : lst)
            if (x % 2 == 0)
                lst.remove(x);
        
        System.out.println(lst);
    }

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

①在运行时抛出异常,②正常
原因分析:因为增强的for循环内部就是调用iterator实现的,在遍历的时候就将list转化为了迭代器,当迭代器被创建之后,如果从结构上对列表修改除非通过迭代器自身的remove、add方法,其他任何时间任何方式的修改,迭代器都会抛出ConcurrentModificationException异常。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2