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这个周期一般只适合于迭代。提取数据显示,不适合根据标准添加复杂的操作,例如删除和使用。