Map遍历效率比较

原博https://blog.csdn.net/zhangsify/article/details/52966094

 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来遍历效率更高
--------------------- 
作者:张思思 
来源:CSDN 
原文:https://blog.csdn.net/zhangsify/article/details/52966094?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值