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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李万海 中级黑马   /  2013-3-24 09:16  /  2177 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李万海 于 2013-3-28 18:45 编辑

下面是部分遍历集合元素的代码。
  1. //利用迭代器进行遍历
  2. public static void work(Map<String, Student> map) {
  3.         Collection<Student> c = map.values();
  4.         Iterator it = c.iterator();
  5.         for (; it.hasNext();) {
  6.             System.out.println(it.next());
  7.         }
  8.     }
  9. //利用keyset进行遍历
  10. public static void workByKeySet(Map<String, Student> map) {
  11.         Set<String> key = map.keySet();
  12.         for (Iterator it = key.iterator(); it.hasNext();) {
  13.             String s = (String) it.next();
  14.             System.out.println(map.get(s));
  15.         }
  16.     }
  17. //利用entrySet进行遍历
  18. public static void workByEntry(Map<String, Student> map) {
  19.         Set<Map.Entry<String, Student>> set = map.entrySet();
  20.         for (Iterator<Map.Entry<String, Student>> it = set.iterator(); it.hasNext();) {
  21.             Map.Entry<String, Student> entry = (Map.Entry<String, Student>) it.next();
  22.             System.out.println(entry.getKey() + "--->" + entry.getValue());
  23.         }
  24.     }
  25. }
复制代码
这三种方法在遍历集合时,他们的优缺点是什么?哪种方式更适合在实际开发中应用?为什么?
如果用高级for循环来遍历的话,又有什么区别呢?   

点评

记得及时处理帖子哦,继续追问,或将分类改成【已解决】,谢谢  发表于 2013-3-24 13:46

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

正序浏览
就当是我给自己总结吧,首先要知道的是不同集合可以使用的方法是不一样的,下面我就详细说明下;
List:
      ArrayList  , LinkedList   , Vector:     这三种集合里的元素是可重复的,是有索引的,索引迭代集合可以用for循环,迭代器,增强for循环,能用迭代器的情况下,增强for循环也可以用,只是要注意,使用增强for循环不可以改变集合里的结构。至于选择哪种,大部分优先考虑用增强for循环,增强for循环也是jdk5的新特性,之所以要这个新特性,也是有一定道理的。
set:
      HashSet  , LinkedHash  , TreeSet  :这三种集合里是没有索引的,所以就不能用for循环了,  所以就只能用迭代器和增强for循环了,优先还是考虑使用增强for循环。
Map:
      HashMap  , TreeMap    ,LinkedHashMap :map集合有他们自己和上面不同的方法,分别是keySet()和entrySet(),两种方法,keySet()稍微简单些,至于说的效率,我觉得没多大的必要去考虑那些!

回复 使用道具 举报
A   测试keySet()与entrySet()的迭代时间
keySet():迭代后只能通过get()取key
entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口 .
     最后说明下keySet()的速度比entrySet()慢了很多。

B  迭代器的概念:
        对已集合类中的任何一个实现类,都可以返回这样一个Iterator对象。
       就和循环一样,好处是可以适用于任何一个类,而且实际上java对他进行了优化,比直接用index访问快一点

      有一点很好,就是用起来确实很好用~~加上泛型就更好用啦~~
     配合上泛型,一个好处是it.next()可以不用类型转换啦~

  以前用的时候是Object,还要自己转.
    我认为,Iterator和泛型简直就是绝配哈~~单独用貌似都没什么直接好处

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
Set<K> keySet()
返回此映射中包含的键的 Set 视图。 写的很清楚就是key的Set
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图。
也是一个Set,而Set中每个元素是内部类Map.Entry。
for(){}
只能获取集合元素。但是不能对集合进行操作
迭代器除了遍历集合元素,还可以进行remove集合中元素的动作
如果是用Listiterator 还可以在遍历过程中对集合进行增删改查的动作
传统for和高级for有什么区别呢?
高级for有一个局限性必须有被遍历的目标

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 胡志超 于 2013-3-24 09:53 编辑

当然是利用entrySet进行遍历,利用key查value,效率更高点,优缺点我也没有系统的总结,

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

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