java map集合如何遍歷效率高
阿新 • • 發佈:2018-11-24
java map集合如何遍歷效率高
一、前言
1、在看 《阿里巴巴java開發手冊》時候,有一條推薦的規約: 【推薦】使用entrySet遍歷Map類集合KV,而不是keySet方式進行遍歷。 說明:keySet其實是遍歷了2次,一次是轉為Iterator物件,另一次是從hashMap中取出key所對應的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。 ---- 那麼如何理解那一段話呢? map 集合如何遍歷效率高?
二、Map集合的遍歷
1、根據 key 找 value
- 獲取所有的 key 集合。 map.keySet()
-
遍歷 key 集合。
-
根據 key 到集合中去找 value 。 map.get(key)
2、根據 key--value 鍵值對 找鍵和值
- 獲取所有的 key--value鍵值對集合。 map.entrySet()
- 遍歷鍵值對集合,獲取每一個鍵值對物件。
- 根據鍵值對物件,獲取 key 鍵 和 value 值。 entry.getKey(); entry.getValue();
3、遍歷values 值物件: map.values();
三、程式碼實現
1、 遍歷測試程式碼如下:
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.junit.Test; /** * description: 遍歷Map集合效率比較 * @version v1.0 * @author w * @date 2018年10月23日上午11:20:08 */ public class ForeachMap { /** * description: 初始化map集合中元素 * @param map * @version v1.0 * @author w * @date 2018年10月23日 下午2:45:35 */ public void init(Map<Integer, String> map){ // 初始化map集合中元素的個數 int count = 1000000; for (int i = 1; i <= count; i++) { map.put(i, i+ " ---> map"); } } @Test public void test(){ Map<Integer, String> map = new HashMap<>(); Map<Integer, String> map2 = new HashMap<>(); long start = System.currentTimeMillis(); init(map); init(map2); System.out.println("裝載map耗時: "+(System.currentTimeMillis()-start)+ " ms"); start = System.currentTimeMillis(); foreachKeyset(map); System.out.println("foreachKeyset 遍歷 map耗時: "+(System.currentTimeMillis()-start)+ " ms"); start = System.currentTimeMillis(); foreachEntry(map2); System.out.println("foreachEntry 遍歷 map耗時: "+(System.currentTimeMillis()-start)+ " ms"); start = System.currentTimeMillis(); iteratorEntry(map2); System.out.println("iteratorEntry 遍歷 map耗時: "+(System.currentTimeMillis()-start)+ " ms"); System.out.println(map.size()); } /** * description: 根據 key 找 value * @param map * @version v1.0 * @author w * @date 2018年10月23日 下午5:10:01 */ private void foreachKeyset(Map<Integer, String> map) { for(Integer key : map.keySet()){ String value = map.get(key); // System.out.println("foreachKeyset : key :" + key + "---> value :"+ value); } } /** * description: 根據 key--value 鍵值對 找鍵和值 ( foreach 遍歷) * @param map * @version v1.0 * @author w * @date 2018年10月23日 下午5:19:31 */ private void foreachEntry(Map<Integer, String> map) { for(Entry<Integer, String> entry : map.entrySet()){ // System.out.println("foreachEntry : key :" + entry.getKey() + "---> value :"+entry.getValue()); } } /** * description: 根據 key--value 鍵值對 找鍵和值 ( iterator 遍歷) * @param map * @version v1.0 * @author w * @date 2018年10月23日 下午5:19:01 */ private void iteratorEntry(Map<Integer, String> map) { Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator(); while(iterator.hasNext()){ Entry<Integer, String> entry = iterator.next(); // System.out.println("iteratorEntry : key :" + entry.getKey() + "---> value :"+entry.getValue()); } } }
2、執行結果:
裝載map耗時: 2705 ms
foreachKeyset 遍歷 map耗時: 44 ms
foreachEntry 遍歷 map耗時: 22 ms
iteratorEntry 遍歷 map耗時: 17 ms
1000000
四、總結
1、遍歷 map 集合時,應該同時遍歷出 鍵值對,這樣效率更高。
2、若遍歷過程中,需要根據條件刪除集合中元素,參考:https://blog.csdn.net/HaHa_Sir/article/details/80295755
參考資料: https://blog.csdn.net/zhangsify/article/details/52966094#commentBox