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");
- 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来遍历效率更高
转载:https://blog.csdn.net/zhangsify/article/details/52966094