keyset与entryset

 

keyset与entryset

转自 http://blog.csdn.net/lwzcjd/article/details/5432430

 

1、基本概述

Set<Map.Entry<K,V>> entrySet()  返回此映射中包含的映射关系的 set 视图。

Set<K>              keySet()      返回此映射中包含的键的 set 视图。

2、效率分析

对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了。

3、使用举例

Map<String, String> maps = new HashMap<String, String>();  
  //方法一: 用entrySet()  
  Iterator<Entry<String,String>> it = maps.entrySet().iterator();  
  while(it.hasNext()){  
   Map.Entry<String,String> m = it.next();  
   String key = m.getKey();
   String value= m.getValue();
  }  
  // 方法二:jdk1.5支持,用entrySet()和For-Each循环()  
  for (Map.Entry<String, String> m : maps.entrySet()) {  
   String key = m.getKey();
   String value= m.getValue();   
  }  
  // 方法三:用keySet()  
  Iterator<String> it2 = maps.keySet().iterator();  
  while (it2.hasNext()){  
   String key = it2.next();
   String value= maps.get(key);
  }  
  // 方法四:jdk1.5支持,用keySet()和For-Each循环  
  for(String m: maps.keySet()){  
   String key = m;
   String value= maps.get(m);
  }

foreach和while的效率几乎是差不多的,而for则相对较慢一些。foreach可以替代掉for吗?显然不是。
foreach 的内部原理其实还是 Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove(),更不能使用下标来方便的访问元 素。因此foreach这种循环一般只适合做数组的遍历,提取数据显示等,不适合用于增加删除和使用下标等复杂的操作。

你可能感兴趣的:(map,keyset,entrySet)