遍历HashMap的几种方式及效率对比

  Java   14分钟   247浏览   0评论

你好呀,我是小邹。

关于Map的四种遍历方法,大家建议使用entrySet,认为entrySet对于大数据量的查找来说,速度更快;今天我们就通过不同方法来遍历key+value,key,value,体会不同情景下的差异。

测试数据

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 <= 1000000; 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 <= 1000000; i++) {
    key = "" + (i * 50);
    value = "value" + key;
    map.put(key, value);
}

场景测试

遍历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");

遍历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");

遍历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");

时间对比

遍历key+value

遍历内容:key+value HashMap1 HashMap2
keySet用iterator遍历 33 47
Keyset用for遍历 36 51
entrySet用iterator遍历 27 43
entrySet用for遍历 32 42

遍历key

遍历内容:key HashMap1 HashMap2
keySet用iterator遍历 24 35
Keyset用for遍历 24 36
entrySet用iterator遍历 38 56
entrySet用for遍历 34 58

遍历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

总结

从上面的时间比较来看:

1)map的key采用简单形式和复杂形式时,查找的效率是不同的,简单的key值效率更高。

2)当数据量大的时候,采用entrySet遍历key+value的效率要高于keySet。

3)当我们只需要取得value值时,采用values来遍历效率更高。

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  0 条评论