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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 逝去的记忆ヽ 于 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循环来遍历的话,又有什么区别呢?

4 个回复

倒序浏览
增强型的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);//错误!
  }
回复 使用道具 举报
首先应该明确的是,Map底层维护的的Entry对象,当然使用EntrySet的遍历要效率高,这是以前老版本中唯一一个遍历map的方式,KeySet方法中取得键值的操作是非常耗时的,另外最主要的缺点是你在遍历的时候可以删除,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。
如果采用增强for循环,除了泛型的问题外,最重要的就是如果你遍历的是一个空的map对象,for循环将抛出NullPointerException,因此在遍历前你总是应该检查空引用。
回复 使用道具 举报
itertor即枚举器,枚举器是Java在后台自动排序好,比纯粹的for循环要快,因为如果用 for循环,也需要将List中的对象依次取出,这样对内存的调用是随机的,不如Iterator
回复 使用道具 举报
对于keySet遍历了2次,一次是转为iterator,一次从取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马