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 |
從上面的時間比較來看:
1)map的key採用簡單形式和複雜形式時,查詢的效率是不同的,簡單的key值效率更高
2)當資料量大的時候,採用entrySet遍歷key+value的效率要高於keySet
3)當我們只需要取得value值時,採用values來遍歷效率更高