1. 程式人生 > >HashMap四種遍歷方式及效能比較

HashMap四種遍歷方式及效能比較

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更簡潔,推薦使用。