1.起源
在什么时刻应该选择什么样的遍历方式?我们必须比较这些做法来看效率。我们也看了很多文章。我们建议使用entrySet,认为entrySet查找大数据更快。今天我们就用不同的方法来遍历不同场景下键+值、键和值的区别。
2.准备测试数据:
HashMap1:大小为100000,key和值都是字符串,key的值为1,2,3 ………1000000;
Map<String,String> ***p =new HashMap<String,String>(); String key,value; for(int i=1;i<=num;i++){ key = ""+i; value="value"+i; ***p.put(key,value); }
HashMap2:大小为100000,key和值为String,key的值为50,100,150 ……..50000000;
Map<String,String> ***p = new HashMap<String,String>(); String key,value; for(int i=1;i<=num;i++){ key=""+(i*50); value="value"+key; ***p.put(key,value);}
3.现场测试
3.1遍历键+值
1)迭代器遍历了键集。
long startTime1 =System.currentTimeMillis();Iterator<String> iter = ***p.keySet().iterator();while (iter.hasNext()){ key=iter.next(); value=***p.get(key);}long endTime1 =System.currentTimeMillis();System.out.println("第一个程序运行时间:"+(endTime1-startTime1)+"ms");
2)用于遍历的键集。
long startTime2 =System.currentTimeMillis(); for(String key2:***p.keySet()){ value=***p.get(key2); }long endTime2 =System.currentTimeMillis();System.out.println("第二个程序运行时间:"+(endTime2-startTime2)+"ms");
Iterator遍历entrySet
long startTime3=System.currentTimeMillis();Iterator<Map.Entry<String,String>> iter3 =***p.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用于遍历。
long startTime4=System.currentTimeMillis();for(Map.Entry<String,String> entry4:***p.entrySet()){ key=entry4.getKey(); value=entry4.getValue();}long endTime4 =System.currentTimeMillis();System.out.println("第四个程序运行时间:"+(endTime4-startTime4) +"ms");
3.2遍历键
1)迭代器遍历了键集。
long startTime1 =System.currentTimeMillis();Iterator<String> iter = ***p.keySet().iterator();while (iter.hasNext()){ key=iter.next();}long endTime1 =System.currentTimeMillis();System.out.println("第一个程序运行时间:"+(endTime1-startTime1)+"ms");
2)用于遍历的键集。
long startTime2 =System.currentTimeMillis();for(String key2:***p.keySet()){}long endTime2 =System.currentTimeMillis();System.out.println("第二个程序运行时间:"+(endTime2-startTime2)+"ms");
Iterator遍历entrySet
long startTime3=System.currentTimeMillis();Iterator<Map.Entry<String,String>> iter3 =***p.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用于遍历。
long startTime4=System.currentTimeMillis();for(Map.Entry<String,String> entry4:***p.entrySet()){ key=entry4.getKey();}long endTime4 =System.currentTimeMillis();System.out.println("第四个程序运行时间:"+(endTime4-startTime4) +"ms");
3.3遍历值
1)迭代器遍历了键集。
long startTime1 =System.currentTimeMillis();Iterator<String> iter = ***p.keySet().iterator();while (iter.hasNext()){ value=***p.get(iter.next());}long endTime1 =System.currentTimeMillis();System.out.println("第一个程序运行时间:"+(endTime1-startTime1)+"ms");
2)用于遍历的键集。
long startTime2 =System.currentTimeMillis();for(String key2:***p.keySet()){ value=***p.get(key2);}long endTime2 =System.currentTimeMillis();System.out.println("第二个程序运行时间:"+(endTime2-startTime2)+"ms");
Iterator遍历entrySet
long startTime3=System.currentTimeMillis();Iterator<Map.Entry<String,String>> iter3 =***p.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用于遍历。
long startTime4=System.currentTimeMillis();for(Map.Entry<String,String> entry4:***p.entrySet()){ value=entry4.getValue();}long endTime4 =System.currentTimeMillis();System.out.println("第四个程序运行时间:"+(endTime4-startTime4) +"ms");
5)迭代器遍历值
long startTime5=System.currentTimeMillis();Iterator<String> iter5=***p.values().iterator();while (iter5.hasNext()){ value=iter5.next();}long endTime5 =System.currentTimeMillis();System.out.println("第五个程序运行时间:"+(endTime5-startTime5) +"ms");
6)使用for遍历值
long startTime6=System.currentTimeMillis();for(String value6:***p.values()){}long endTime6 =System.currentTimeMillis();System.out.println("第六个程序运行时间:"+(endTime6-startTime6) +"ms");
4.时间比较
4.1遍历键+值
4.2遍历键
4.3遍历值
5.摘要
从以上时间对比来看:
1)当1)***p的键采用简单形式和复杂形式时,搜索效率不同,简单键值效率更高。
2)当数据量较大时,entrySet遍历key+value的效率高于keySet。
3)当我们只需要得到值的时候,用值来遍历效率更高。
本文来自柠檬琉璃夏投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/636858.html