你好呀,我是小邹。
关于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