首先我们准备数据,准备一个map
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < 10; i++) {
map.put(i + "", "value" + i);
}
然后我们采用传说中的key遍历: 步骤:先弄成key set,然后遍历key set 通过key从map中获取value
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String val = map.get(key);
System.out.println(key + "->" + val);
}
System.out.println("*********************");
然后我们在采用entrySet的方式遍历下:
步骤:先弄成entrySet 然后遍历他,获取key和value
Set<Entry<String, String>> set = map.entrySet();
Iterator<Entry<String, String>> s = set.iterator();
while (s.hasNext()) {
Entry<String, String> en = s.next();
String key = en.getKey();
String val = en.getValue();
System.out.println(key + "->" + val);
}
孰优孰劣? 看JDK源码,对比两种访问方式:
首先看KeySet访问方式:
public Set<K> keySet() {
if (keySet == null) {
keySet = new AbstractSet<K>() {
public Iterator<K> iterator() {
return new Iterator<K>() {
private Iterator<Entry<K,V>> i = entrySet().iterator();
public boolean hasNext() {
return i.hasNext();
}
public K next() {
return i.next().getKey();
}
public void remove() {
i.remove();
}
};
}
public int size() {
return AbstractMap.this.size();
}
public boolean contains(Object k) {
return AbstractMap.this.containsKey(k);
}
};
}
return keySet;
}
也就是调用entrySet()从entryset中获取key,也就是说是在entry set的基础上来做的,貌似多次一举
结论:
通过上述代码我们就知道,采用entrySet方式要优于keySet,因为keySet首先要访问entrySet来组建一个keySet,重复工作不言而喻。
所以使用entrySet的效率更高些,或许很多时候我们都不太注意这些,但是从源码中就可以得到答案了。
http://outofmemory.cn/code-snippet/1508/HashMap-2-zhong-bianli-mode-match