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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李涛涛 中级黑马   /  2012-3-15 15:35  /  2175 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

增强 for 循环和for循环有什么区别

3 个回复

倒序浏览
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

查看全部评分

回复 使用道具 举报
我们先说说这个高级for循环的用处于吧,其实它就是一个高度封装的迭代器.对集合进行遍历,但是只能获取元素。不能对集合进行操作。
那么普通的迭代器呢?
除了遍历集合,还可以进行remove集合中元素的动作,改变了原集合
如使用ListIterator还可以在遍历过程中,对集合进行增删改查的动作。
并且凡是支持迭代器的都支持高级for循环

再说传统for循环,和高级for循环有什么区别呢:
就一个。那就是高级for有一个局限性,必须有被遍历的目标。

比如讲hello world打印100次高级for的作用显然不适合完成这样的任务.
建议:在遍历数组的时候,还是希望使用传统for,因为传统for还可以定义脚标。方便我们对元素的操作。
回复 使用道具 举报
增强for循环有一个特点:必须要有被遍历的目标。
这个目标只能是Collection集合或者数组。

传统for循环可以定义三种表达式,来丰富循环的操作,
尤其是可以控制循环的增量。

所以,在遍历数组时,如果仅为遍历获取,两个for循环都行。
如果要对数组的元素进行操作,就需要用到指针,所以建议还是使用传统for循环。

class  Demo
{
        public static void main(String[] args)
        {

                method();



        }

        public static void method()
        {
                int[] arr = {4,5,1,7,5};

                for(int i : arr)
                {
                        System.out.println("i="+i);
                }
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马