1. 程式人生 > >Map遍歷效率比較

Map遍歷效率比較

 1、由來     

      上次部落格提到了Map的四種遍歷方法,其中有的只是獲取了key值或者是value值,但我們應該在什麼時刻選擇什麼樣的遍歷方式呢,必須通過實踐的比較才能看到效率。

        也看了很多文章,大家建議使用entrySet,認為entrySet對於大資料量的查詢來說,速度更快,今天我們就通過下面採用不同方法遍歷key+value,key,value不同情景下的差異。

2、準備測試資料:

      HashMap1:大小為1000000,key和value的值均為String,key的值為1、2、3.........1000000;

    Map<String,String> map =new HashMap<String,String>();
        String key,value;

        for(int i=1;i<=num;i++){
            key = ""+i;
            value="value"+i;
            map.put(key,value);
        }
      

      HashMap2:大小為1000000,key和value的值為String,key的值為50、100、150........50000000;

     Map<String,String> map = new HashMap<String,String>();
        String key,value;

        for(int i=1;i<=num;i++){
            key=""+(i*50);
            value="value"+key;
            map.put(key,value);
     }

3、場景測試

    3.1遍歷key+value

      1)keySet利用Iterator遍歷

    long startTime1 =System.currentTimeMillis();
    Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()){
          key=iter.next();
          value=map.get(key);
    }
    long endTime1 =System.currentTimeMillis();
    System.out.println("第一個程式執行時間:"+(endTime1-startTime1)+"ms");

     2)keySet利用for遍歷

      long startTime2 =System.currentTimeMillis();
        for(String key2:map.keySet()){
            value=map.get(key2);
        }
        long endTime2 =System.currentTimeMillis();
        System.out.println("第二個程式執行時間:"+(endTime2-startTime2)+"ms");

     3)entrySet利用Iterator遍歷

long startTime3=System.currentTimeMillis();
        Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
        Map.Entry<String,String> entry3;
        while (iter3.hasNext()){
            entry3 = iter3.next();
            key = entry3.getKey();
            value=entry3.getValue();
        }
        long endTime3 =System.currentTimeMillis();
        System.out.println("第三個程式執行時間:" +(endTime3-startTime3)+"ms");
     4)entrySet利用for遍歷
long startTime4=System.currentTimeMillis();
        for(Map.Entry<String,String> entry4:map.entrySet()){
            key=entry4.getKey();
            value=entry4.getValue();
        }
        long endTime4 =System.currentTimeMillis();
        System.out.println("第四個程式執行時間:"+(endTime4-startTime4) +"ms");

    3.2遍歷key

       1)keySet利用Iterator遍歷

long startTime1 =System.currentTimeMillis();
        Iterator<String> iter = map.keySet().iterator();
        while (iter.hasNext()){
            key=iter.next();

        }
        long endTime1 =System.currentTimeMillis();
        System.out.println("第一個程式執行時間:"+(endTime1-startTime1)+"ms");

       2)keySet利用for遍歷
long startTime2 =System.currentTimeMillis();
        for(String key2:map.keySet()){

        }
        long endTime2 =System.currentTimeMillis();
        System.out.println("第二個程式執行時間:"+(endTime2-startTime2)+"ms");

       3)entrySet利用Iterator遍歷
 long startTime3=System.currentTimeMillis();
        Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
        Map.Entry<String,String> entry3;
        while (iter3.hasNext()){
            key = iter3.next().getKey();

        }
        long endTime3 =System.currentTimeMillis();
        System.out.println("第三個程式執行時間:" +(endTime3-startTime3)+"ms");

       4)entrySet利用for遍歷
 long startTime4=System.currentTimeMillis();
        for(Map.Entry<String,String> entry4:map.entrySet()){
            key=entry4.getKey();
        }
        long endTime4 =System.currentTimeMillis();
        System.out.println("第四個程式執行時間:"+(endTime4-startTime4) +"ms");

     

     3.3遍歷value


        1)keySet利用Iterator遍歷

long startTime1 =System.currentTimeMillis();
        Iterator<String> iter = map.keySet().iterator();
        while (iter.hasNext()){
           value=map.get(iter.next());
        }
        long endTime1 =System.currentTimeMillis();
        System.out.println("第一個程式執行時間:"+(endTime1-startTime1)+"ms");

           2)keySet利用for遍歷
 long startTime2 =System.currentTimeMillis();
        for(String key2:map.keySet()){
            value=map.get(key2);
        }
        long endTime2 =System.currentTimeMillis();
        System.out.println("第二個程式執行時間:"+(endTime2-startTime2)+"ms");

         3)entrySet利用Iterator遍歷
 long startTime3=System.currentTimeMillis();
        Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
        Map.Entry<String,String> entry3;
        while (iter3.hasNext()){
           value=iter3.next().getValue();

        }
        long endTime3 =System.currentTimeMillis();
        System.out.println("第三個程式執行時間:" +(endTime3-startTime3)+"ms");

          4)entrySet利用for遍歷
long startTime4=System.currentTimeMillis();
        for(Map.Entry<String,String> entry4:map.entrySet()){
            value=entry4.getValue();
        }
        long endTime4 =System.currentTimeMillis();
        System.out.println("第四個程式執行時間:"+(endTime4-startTime4) +"ms");

         5)values利用iterator遍歷

 long startTime5=System.currentTimeMillis();
        Iterator<String>  iter5=map.values().iterator();
        while (iter5.hasNext()){
            value=iter5.next();
        }
        long endTime5 =System.currentTimeMillis();
        System.out.println("第五個程式執行時間:"+(endTime5-startTime5) +"ms");

       6)values利用for遍歷

 long startTime6=System.currentTimeMillis();
        for(String value6:map.values()){

        }
        long endTime6 =System.currentTimeMillis();
        System.out.println("第六個程式執行時間:"+(endTime6-startTime6) +"ms");

4、時間對比

     4.1遍歷key+value

遍歷內容:key+value

HashMap1

HashMap2

keySet用iterator遍歷

56

93

Keyset用for遍歷

50

91

entrySet用iterator遍歷

40

70

entrySet用for遍歷

41

73

     4.2遍歷key

遍歷內容:key

HashMap1

HashMap2

keySet用iterator遍歷

37

58

Keyset用for遍歷

34

57

entrySet用iterator遍歷

38

56

entrySet用for遍歷

34

58

      4.3遍歷value

遍歷內容:value

HashMap1

HashMap2

keySet用iterator遍歷

65

86

Keyset用for遍歷

54

80

entrySet用iterator遍歷

42

61

entrySet用for遍歷

44

61

Values用iterator遍歷

37

63

Values用for遍歷

47

54

5、總結

      從上面的時間比較來看:

      1)map的key採用簡單形式和複雜形式時,查詢的效率是不同的,簡單的key值效率更高

      2)當資料量大的時候,採用entrySet遍歷key+value的效率要高於keySet

      3)當我們只需要取得value值時,採用values來遍歷效率更高