本文轉載自Java Map遍歷方式的選擇。
只給出遍歷方式及結論。測試數據可以去原文看。
如果你使用HashMap
- 同時遍歷key和value時,keySet與entrySet方法的性能差異取決於key的復雜度,總體來說還是推薦使用entrySet。換言之,取決於HashMap查找value的開銷。entrySet一次性取出所有key和value的操作是有性能開銷的,當這個損失小於HashMap查找value的開銷時,entrySet的性能優勢就會體現出來。例如上述對比測試中,當key是最簡單的數值字符串時,keySet可能反而會更高效,耗時比entrySet少10%。總體來說還是推薦使用entrySet。因為當key很簡單時,其性能或許會略低於keySet,但卻是可控的;而隨着key的復雜化,entrySet的優勢將會明顯體現出來。當然,我們可以根據實際情況進行選擇
- 只遍歷key時,keySet方法更為合適,因為entrySet將無用的value也給取出來了,浪費了性能和空間。在上述測試結果中,keySet比entrySet方法耗時少23%。
- 只遍歷value時,使用vlaues方法是最佳選擇,entrySet會略好於keySet方法。
在不同的遍歷寫法中,推薦使用如下寫法:

for (String key : map.keySet()) { }

for (String value : map.values()) { }

for (Entry<String, String> entry: map.entrySet()) { key = entry.getKey(); value = entry.getValue(); }
如果你使用TreeMap
- 同時遍歷key和value時,entrySet的性能遠遠高於keySet。這是由TreeMap的查詢效率決定的,也就是說,TreeMap查找value的開銷較大,明顯高於entrySet一次性取出所有key和value的開銷。因此,遍歷TreeMap時強烈推薦使用entrySet方法。
- 只遍歷key時,keySet方法更為合適,因為entrySet將無用的value也給取出來了,浪費了性能和空間。在上述測試結果中,keySet比entrySet方法耗時少24%。
- 只遍歷value時,使用vlaues方法是最佳選擇,entrySet也明顯優於keySet方法。
在不同的遍歷寫法中,推薦使用如下寫法:

for (String key : map.keySet()) { }

for (String value : map.values()) { }

for (Entry<String, String> entry: map.entrySet()) { key = entry.getKey(); value = entry.getValue(); }