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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 克零岚 中级黑马   /  2013-3-2 15:19  /  3273 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学习视频的时候,遇到了增强的for循环,增强的for循环毫无疑问可以遍历数组,那么对于集合的遍历呢,对对象的集合(Collection)和键值对集合(Map)都支持吗?增强的for循环对集合的增删改查操作有限制吗? 还有那么传统的for循环与增强的for循环有什么大的区别吗?  呵呵 ,不好意思,还请前辈们解惑啊,发现东西越学越多了

7 个回复

倒序浏览
我只知道 增强for循环必须要有遍历的对象.不像传统for有条件表达式.....比如 我要把"hello java"打印5遍 用高级for就很蛋疼...再具体我也不清楚了.
坐等高人来解答吧...{:soso_e104:}

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9

查看全部评分

回复 使用道具 举报
本帖最后由 李志卫 于 2013-3-2 15:42 编辑

增强For能遍历数组、Collection集合。Map集合的keySet和entrySet也可以(也就是Set集合)。
增强for底层就是用迭代器Iterator实现的,所以我想也会和迭代器限制了集合的其他操作,你可以试一试。
要对List集合遍历进行其他操作可以用Llistiterator.

再补充一下笔记
高级for有一个局限性。必须有被遍历的目标。(就是要先有(collection)集合或者数组,才能高级for遍历)例如要求输出一百遍 hello world!。
建议在遍历数组时候,还是用传统for。
能用迭代器Iterator的时候就能用高级for,因为高级for的底层就是迭代器完成的,高级for只是一种简写。
高级for   for(数据类型 变量名:集合或数组) 中变量类型要求与集合的泛型一致,没有泛型用Object。

评分

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

查看全部评分

回复 使用道具 举报
增强for是java 1.5的新特性,是为了替代迭代器而出现的,他不但可以遍历数组还可以遍历集合。一般的话,set map  都可用它。
主要看你用进行什么操作,一般如果只是遍历集合的话,用增强fo绝对没错的。

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,
但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强for循环,也就是iterator。

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
1..对对象的集合(Collection)和键值对集合(Map)都支持吗?
答:不支持的,,因为map集合里面没有迭代器,,,凡是支持迭代器的集合他们都支持高级for,,高级for是迭代器的简写形式

map集合里面为什么没有迭代器:
接口 Collection<E>他里面有迭代器,,Collection接口继承了接口 Iterable<T>,,Iterable<T>里面封装了iterator() 方法返回一个迭代器,,比如出现接口 Collection2<E>继承了接口 Iterable<T>时这个接口 Collection2<E>就具备了迭代方法,,map集合没有实现接口 Iterable<T>,所以map里面没有迭代器



代码:
                HashMap<Integer,String> hm = new HashMap<Integer,String>();

                hm.put(1,"a");
                hm.put(2,"b");
                hm.put(3,"c");
               
                Set<Map.Entry<Integer,String>> set=hm.entrySet();  都要转成set集合,因为map集合不支持迭代

                //这里不能放map集合,,,,放set集合,,,或者for (Map.Entry<Integer, String> entry : set) {,,这里面的类型是:set集合里面存什么类型那么高级for里面就存什么类                         // 型,,比如set里面是Map.Entry类型那么for里面就是Map.Entry
                for (Entry<Integer, String> entry : set) {               
                        Integer key=entry.getKey();
                        String string=entry.getValue();
                        System.out.println(key+"   "+string);
                       
                }

或者这样遍历

                Set<Integer> set=hm.keySet();
               
                for (Integer i : set) {
                        System.out.println(i+"      "+hm.get(i));
                }

2...增强的for循环对集合的增删改查操作有限制吗?

答;增强的for循环对集合进行遍历,只能获取集合元素,但是不能对集合进行操作他只能获取集合中的元素,。只能对集合中的元素进行取出,,不能做修改动作,所以集合中的数据没有改变,,而迭代器可以取出修改,迭代器除了遍历,还可以进行remove集合中元素的动作。迭代器操作完以后集合变了,,,,
如果使用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。



3... 还有那么传统的for循环与增强的for循环有什么大的区别吗?

答:有的

高级for有一个局限性,必须有被遍历的目标,比如我想要把"aa"打印100次,,,高级for就做不了就得用传统for,,,,

建议在遍历数组的时候,还是希望使用传统for。因为传统for可以定义脚标。

评分

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

查看全部评分

回复 使用道具 举报
1   高级for循环 底层实现就是用的迭代器Iterator  因为Map里面没有迭代器  所以高级for只对Collection使用
2   从高级for的格式来看  for(数据类型  变量名:集合或数组);  他除了定义一个变量用来存储取出的值  别的功能说明都没有 而且该变量时局部的  作用范围有限  
     所以高级for就一个取出的功能 别的没了
3   区别 :两者的使用范围基本完全不同   对数组或集合遍历时用高级for  其他都用传统for
              而且建议遍历数组也用传统for   因为可以操作角标

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
for-each循环在简洁性和预防bug方面有着传统的for循环无法比拟的优势,并且没有性能损失,我们应该尽可能地使用for-each循环。但是在以下三种情况下是不能使用for-each的:



1.过滤
如果要遍历集合,并删除选定的元素,就需要使用显势的迭代器,以便可以调用它的remove方法。


2.转换
如果需要遍历列表或者数组,并取代它部分或者全部的元素值,就需要列表迭代器或者数组索引,以便设定元素的值。


3.平行迭代
如果需要并行地遍历多个集合,就需要显式地控制迭代器和数组索引变量,以便所有的迭代器或者索引值变量都可以得到同步前移。




eg:
Java代码  
List<Case> caseLists = caseService.getDetailYzjByNo(caseBean  
                    .getCaseNo());  
            for (Case caseinfo : caseLists) {  
                if (caseinfo.getCaseTypeId() == 134  
                        && caseBean.getCaseId() != caseinfo.getCaseId()) {  
                    request.setAttribute("LianBanCase", "LianBanCase");  
                    break;  
                }  
            }  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马