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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王大斌 中级黑马   /  2013-4-7 22:36  /  1729 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王大斌 于 2013-4-7 23:32 编辑

在java中,既可以用高级for循环,也可以使用iterator去遍历一个集合,感觉高级for方便啊,请问什么时候用iterator去遍历一个集合

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
高级for 只能对集合中的对象进行打印输出等操作,并不能操作集合的内容,如修改对象的值,添加删除元素等等,Iterator具备这样的功能
回复 使用道具 举报
1.增强for循环和iterator遍历的效果是一样的,增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,不能在增强循环里动态的删除集合内容。不能获取下标等。
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator。
以下例子证明第一点
①     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);
    }
①在运行时抛出异常,②正常
原因分析:因为增强的for循环内部就是调用iterator实现的,在遍历的时候就将list转化为了迭代器,当迭代器被
创建之后,如果从结构上对列表修改除非通过迭代器自身的remove、add方法,其他任何时间任何方式的修改,迭代
器都会抛出ConcurrentModificationException异常。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
当你在遍历一个集合,同时要操作集合,这个操作涉及到集合的大小(比如删除,添加)的时候,就要用iterator。
如果你遍历集合的同时删除集合中的元素,用增强for循环或者一般的for循环方式,不会得到正确结果,甚至还会报错

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
增强for循环就是用的iterator~~可以做个小实验~~

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;



  4. public class Demo01 {

  5. public static void main(String[] args) throws Exception {

  6. List<String> list = new ArrayList<String>();
  7. list.add("1");
  8. list.add("2");
  9. list.add("3");

  10. for(Iterator<String> it = list.iterator();it.hasNext();){
  11. System.out.println(it.next());
  12. //list.remove(1);
  13. }

  14. for(String string : list){
  15. System.out.println(string);
  16. //list.remove(1);
  17. }

  18. for (int i = 0; i < list.size(); i++) {
  19. System.out.println(list.get(i));
  20. list.remove(1);
  21. }
  22. }


  23. }
复制代码
回复 使用道具 举报
for,while是一样的,形式上的不同
foreach,Iterator也是一样的,形式上的不同

性能肯定是用迭代器的好一些。迭代器能直接访问集合内部元素。而且有的集合没有索引,没法用for来遍历,只有用迭代器。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马