对于HashMap中的Key和Value的遍历有两种方法:
1.通过HashMap.keySet()方法返回key的集合,通过遍历该集合的key得到相应的value值。
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}
2.通过HashMap.entrySet()方法返回整个Entry<K,V>对象的集合,遍历该集合中的每一个键值对Map.Entry类型,Entry.getValue() Entry.getKey()得到相应的值和键。
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
两种方法虽然可以得到相同的结果,但是在效率上还是存在差别。
因为在第一种方式中遍历每一个key并通过HashMap.get(object key)来得到相应的值时,实际上这个过程会再次去遍历整个Entry 集合,以下是HashMap中的JDK1.6源码:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
因此第二种方法的效率会要高一些,经过测试发现的确也是这样的。
两个方法还有一个区别就是:第二种方法明显的要耗费更多的内存,因为Entry<K,V>肯定会比单独的Set<K>要大。