代碼如下:
public static void main(String args[]) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("a", "A");
map.put("b", "B");
map.put("c", "C");
// keySet遍歷
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = (String) map.get(key);
System.out.println(value);
}
for (String key : map.keySet()) {
String value = (String) map.get(key);
System.out.println(value);
}
// entrySet遍歷
Iterator<Entry<String, Object>> iterator1 = map.entrySet().iterator();
while (iterator1.hasNext()) {
String value = (String) iterator1.next().getValue();
System.out.println(value);
}
for (Entry<String, Object> entry : map.entrySet()) {
String value = (String) entry.getValue();
System.out.println(value);
}
//
for (Object str : map.values()) {
System.out.println(str);
}
}
關于效率問題:
如果你使用HashMap
同時遍歷key和value時,keySet與entrySet方法的性能差異取決于key的具體情況,如復雜度(復雜對象)、離散度、沖突率等。換言之,取決于HashMap查找value的開銷。entrySet一次性取出所有key和value的操作是有性能開銷的,當這個損失小于HashMap查找value的開銷時,entrySet的性能優(yōu)勢就會體現(xiàn)出來。例如上述對比測試中,當key是最簡單的數(shù)值字符串時,keySet可能反而會更高效,耗時比entrySet少10%。總體來說還是推薦使用entrySet。因為當key很簡單時,其性能或許會略低于keySet,但卻是可控的;而隨著key的復雜化,entrySet的優(yōu)勢將會明顯體現(xiàn)出來。當然,我們可以根據(jù)實際情況進行選擇
只遍歷key時,keySet方法更為合適,因為entrySet將無用的value也給取出來了,浪費了性能和空間。在上述測試結果中,keySet比entrySet方法耗時少23%。
只遍歷value時,使用vlaues方法是最佳選擇,entrySet會略好于keySet方法。
如果你使用TreeMap
同時遍歷key和value時,與HashMap不同,entrySet的性能遠遠高于keySet。這是由TreeMap的查詢效率決定的,也就是說,TreeMap查找value的開銷較大,明顯高于entrySet一次性取出所有key和value的開銷。因此,遍歷TreeMap時強烈推薦使用entrySet方法。