当前位置:首页>编程知识库>后端开发知识>面试官:Java遍历Map集合有哪几种方式?各自效率怎么样?
面试官:Java遍历Map集合有哪几种方式?各自效率怎么样?
阅读 1
2021-05-14

1、由来

我们应该在什么时刻选择什么样的遍历方式呢,必须通过实践的比较才能看到效率,也看了很多文章,大家建议使用entrySet,认为entrySet对于大数据量的查找来说,速度更快,今天我们就通过下面采用不同方法遍历key valuekeyvalue不同情景下的差异。

2、准备测试数据:

HashMap1:大小为1000000keyvalue的值均为Stringkey的值为123.........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:大小为1000000keyvalue的值为Stringkey的值为50100150........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

1keySet利用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");
2keySet利用for遍历
long startTime2 =System.currentTimeMillis();
  for(String key2:map.keySet()){
      value=map.get(key2);
  }
long endTime2 =System.currentTimeMillis();
System.out.println("第二个程序运行时间:" (endTime2-startTime2) "ms");
3entrySet利用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");
4entrySet利用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

1keySet利用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");
2keySet利用for遍历
long startTime2 =System.currentTimeMillis();
for(String key2:map.keySet()){

}
long endTime2 =System.currentTimeMillis();
System.out.println("第二个程序运行时间:" (endTime2-startTime2) "ms");
3entrySet利用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");
4entrySet利用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

1keySet利用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");
2keySet利用for遍历
 long startTime2 =System.currentTimeMillis();
for(String key2:map.keySet()){
    value=map.get(key2);
}
long endTime2 =System.currentTimeMillis();
System.out.println("第二个程序运行时间:" (endTime2-startTime2) "ms");
3entrySet利用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");
4entrySet利用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");
5values利用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");
6values利用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

4.2遍历key<br/>

4.3遍历value<br/>

5、总结<br/>

从上面的时间比较来看:
1mapkey采用简单形式和复杂形式时,查找的效率是不同的,简单的key值效率更高
2)当数据量大的时候,采用entrySet遍历key value的效率要高于keySet
3)当我们只需要取得value值时,采用values来遍历效率更高
 
</h4>
 
  
   来源:blog.csdn.net/zhangsify/article/details/52966094

  
 
 
  
   
    END
   
  
  
   十期推荐
   
    【261期】面试官:说出几个你熟悉的 Zookeeper 命令
    

   
   
    【262期】面试官:谈谈MySQL主从复制的原理
    

   
   
    【263期】面试最后一问:你有什么要问我的吗?
    

   
   
    【264期】盘点MySQL主从复制,在面试中能被问什么?
    

   
   
    【265期】面试官:为什么Integer用==比较时127相等而128不相等?
    

   
   
    【266期】面试官:Redis主从集群切换数据丢失问题如何应对?
    

   
   
    【267期】10道经典MySQL面试题
    

   
   
    【268期】美团面试题:当你的JVM 堆内存溢出后,其他线程是否可继续工作?
    

   
   
    【269期】链表高频面试题(包括反转、合并、相交、分割、环长等)
    

   
   
    【270期】面试官:Spring的Bean实例化过程应该是怎样的?
    

   
   
    

   
  ? ~
以上数据来源于网络,如有侵权,请联系删除。
评论 (0)