1、由來
我們應該在什麼時刻選擇什麼樣的遍歷方式呢,必須通過實踐的比較才能看到效率,也看了很多文章,大家建議使用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

4.2遍歷key

4.3遍歷value

5、總結
從上面的時間比較來看:
1)map的key採用簡單形式和複雜形式時,查找的效率是不同的,簡單的key值效率更高
2)當數據量大的時候,採用entrySet遍歷key+value的效率要高於keySet
3)當我們只需要取得value值時,採用values來遍歷效率更高
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/273226.html
微信掃一掃
支付寶掃一掃