HashMap四種遍歷方式及效能比較
阿新 • • 發佈:2019-02-15
HashMap<Integer,String> map = new HashMap<>();
(1)
/*顯式呼叫map.entrySet()集合迭代器*/
Iterator iter1 = map.entrySet().iterator();
while(iter1.hasNext())
{
Entry entry = (Entry) iter1.next();
Object a = entry.getKey();
Object b = entry.getValue();
}
(2)
/*foreach增強for迴圈實現entrySet*/
for (Entry<Integer, String> str : map.entrySet()) {
int a = str.getKey();
String b = str.getValue();
}
(3)
/*顯式呼叫map.keySet()集合迭代器*/
Iterator iter2 = map.keySet().iterator();
while(iter2.hasNext())
{
String c = map.get(iter2.next());
}
(4)
/*foreach增強for迴圈實現keySet*/
for (Integer str : map.keySet()) {
String c = map.get(str);
}
經過執行多次發現,顯式呼叫map.entrySet()集合迭代器與foreach增強for迴圈時耗幾乎差不多,而當map容量較大時(比如千萬級別)(1)、(2)和(3)、(4)對比會發現,entrySet會比keySet快不少,經過思考發現,如果純粹遍歷不去取值的話,兩者效能幾乎相同(檢視底層原始碼,會發現只是返回值不同,父類相同,所以效能相差不多),而相差的時耗在於要取值的一步(很多人在這裡理解為keySet方式遍歷了兩次),keySet會通過get方法(檢視原始碼發現get的時間複雜度取決於for迴圈的次數,也可以量化為map容量大小)而entrySet則不需要,所以我們可以這樣去使用:
(1)當需要key也需要value時,毫不猶豫選擇entrySet,
(2)當只是遍歷key而無需取value的話,使用keySet即可。
(3)foreach更簡潔,推薦使用。