A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任亚俊 中级黑马   /  2013-12-22 22:46  /  1204 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Iterator与增强for循环的区别是什么呢?
什么时候用Iterator好,什么时候用增强for循环好呢?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
增强For循环只用于获取集合中的元素,不能操作元素。
而Iterator可以操作元素,remove(),移除元素
如果用ListIterator 可以对元素进行增删改查操作。

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

如果你想在迭代的时候,操作元素,就用Iterator或ListIterator

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
一年之后 发表于 2013-12-22 23:16
增强For循环只用于获取集合中的元素,不能操作元素。
而Iterator可以操作元素,remove(),移除元素
如果用Li ...

谢谢,学习了。
回复 使用道具 举报
增强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循环中,我们不需要去检查数组的边界,不必担心数组下标越界。这个问题我想肯定很多人都遇到多了,我也是一样。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
增强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.         }
复制代码



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
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异常。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马