黑马程序员技术交流社区

标题: 用Iterator 遍历集合的3种方法的几个问题。 [打印本页]

作者: 逝去的记忆ヽ    时间: 2012-6-20 20:23
标题: 用Iterator 遍历集合的3种方法的几个问题。
本帖最后由 逝去的记忆ヽ 于 2012-6-21 10:02 编辑

下面是部分遍历集合元素的代码。

//最常规的一种遍历方法
public static void work(Map<String, Student> map) {
        Collection<Student> c = map.values();
        Iterator it = c.iterator();
        for (; it.hasNext();) {
            System.out.println(it.next());
        }
    }
  //利用keyset进行遍历
public static void workByKeySet(Map<String, Student> map) {
        Set<String> key = map.keySet();
        for (Iterator it = key.iterator(); it.hasNext();) {
            String s = (String) it.next();
            System.out.println(map.get(s));
        }
    }
  //利用entrySet进行遍历
public static void workByEntry(Map<String, Student> map) {
        Set<Map.Entry<String, Student>> set = map.entrySet();
        for (Iterator<Map.Entry<String, Student>> it = set.iterator(); it.hasNext();) {
            Map.Entry<String, Student> entry = (Map.Entry<String, Student>) it.next();
            System.out.println(entry.getKey() + "--->" + entry.getValue());
        }
    }
}

那么我要问的就是,这三种方法在遍历集合时,他们的优缺点是什么?哪种方式更适合在实际开发中应用?为什么?
如果用高级for循环来遍历的话,又有什么区别呢?

作者: sbeeqnui1987    时间: 2012-6-20 21:04
增强型的for循环 优点主要体现在集合中,随便举个例子
比如对 set 的遍历
一般是迭代遍历:
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
  String str = it.next();
  System.out.println(str);
}
for循环遍历:
for (String str : set) {
      System.out.println(str);
}


优点还体现在泛型 假如 set中存放的是Object

Set<Object> set = new HashSet<Object>();
for循环遍历:
for (Object obj: set) {
      if(obj instanceof Integer){
                int aa= (Integer)obj;
             }else if(obj instanceof String){
               String aa = (String)obj
             }
              ........
}
如果你用Iterator遍历,那就晕了
map list 也一样

唯一的缺点就是 在遍历 集合过程中,不能对集合本身进行操作

  for (String str : set) {
   set.remove(str);//错误!
  }

作者: 耿鑫    时间: 2012-6-20 21:33
首先应该明确的是,Map底层维护的的Entry对象,当然使用EntrySet的遍历要效率高,这是以前老版本中唯一一个遍历map的方式,KeySet方法中取得键值的操作是非常耗时的,另外最主要的缺点是你在遍历的时候可以删除,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。
如果采用增强for循环,除了泛型的问题外,最重要的就是如果你遍历的是一个空的map对象,for循环将抛出NullPointerException,因此在遍历前你总是应该检查空引用。
作者: whocases    时间: 2012-6-20 21:37
itertor即枚举器,枚举器是Java在后台自动排序好,比纯粹的for循环要快,因为如果用 for循环,也需要将List中的对象依次取出,这样对内存的调用是随机的,不如Iterator
作者: 燃烧端午    时间: 2012-6-20 22:58
对于keySet遍历了2次,一次是转为iterator,一次从取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2