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 |
5、总结
从上面的时间比较来看:
1)map的key采用简单形式和复杂形式时,查找的效率是不同的,简单的key值效率更高
2)当数据量大的时候,采用entrySet遍历key+value的效率要高于keySet
3)当我们只需要取得value值时,采用values来遍历效率更高
Map遍历效率比较的更多相关文章
- Map遍历效率 : entrySet > keySet
1 //entrySet() 2 for (Entry<String, String> entry : map.entrySet()) { 3 Stri ...
- map遍历的几种方式和效率问题
一.map遍历的效率 先创建一个map,添加好数据: Map<String, String> map = new HashMap<>();for (int i = 0; i & ...
- java map遍历方式及效率
本文转载自Java Map遍历方式的选择. 只给出遍历方式及结论.测试数据可以去原文看. 如果你使用HashMap 同时遍历key和value时,keySet与entrySet方法的性能差异取决于ke ...
- map遍历的四种方式
原文 http://blog.csdn.net/dayanxuqun/article/details/26348277 以下是map遍历的四种方式: // 一.推荐只用value的时候用,都懂的... ...
- Map遍历的几种方法
查看Map自带API map遍历方法: public static void main(String[] args) { Map<Integer,String> map = new Has ...
- 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历
分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...
- IOS各种集合遍历效率对比
前言: 对于ios项目开发中总会遇见各种集合遍历,出于对各种遍历效率的好奇心,所以准备写个测试程序测试一下 首先:先声明一个NSMutableArray,测试数据量分别是1000条,10000条,10 ...
- js中三个对数组操作的函数 indexOf()方法 filter筛选 forEach遍历 map遍历
indexOf()方法 indexOf()方法返回在该数组中第一个找到的元素位置,如果它不存在则返回-1. 不使用indexOf时 var arr = ['apple','orange','pea ...
- 原生JS forEach()和map()遍历的区别以及兼容写法
一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...
随机推荐
- nginx deny 封IP
官方文档地址:http://nginx.org/en/docs/http/ngx_http_access_module.html#deny Syntax: deny address | CIDR | ...
- Ubuntu下好用的pdf工具
安装okular sudo apt-get install okular 汉化 sudo apt-get install kde-l10n-zhcn 然后打开PDF文件时,右键选择打开方式选择okul ...
- Feign调用时读取超时(Read timed out executing GET)解决
解决方式(很多人比较关注,所以放在最前面): 因为Feign调用默认的超时时间为一分钟,一分钟接口不能返回就会抛出异常,所以在服务端的yml文件中增加如下配置即可解决: # feign调用超时时间配置 ...
- spring data jpa碰到的坑
1.不能从别的类的repository那里 执行另一个类的sql,这样映射会失败. 2.有entity,就要有repository,并且还要有id注解 3.还要多表联查未测试,估计要用map去映射出来 ...
- C指针的一些小细节
1 int *c;*c=4-->int *c;int b;c=&b;*c=4; 在使用指针之前,一定要将其初始化,当然,如果是赋予一个地址,就相当于使用的同时就进行了初始化.
- HBase 系列(三)—— HBase 基本环境搭建
一.安装前置条件说明 1.1 JDK版本说明 HBase 需要依赖 JDK 环境,同时 HBase 2.0+ 以上版本不再支持 JDK 1.7 ,需要安装 JDK 1.8+ .JDK 安装方式见本仓库 ...
- 你需要知道的 5 个 Linux 新手会犯的失误
Linux 爱好者们分享了他们犯下的一些最大错误. 终身学习是明智的 —— 它可以让你的思维敏捷,让你在就业市场上更具竞争力.但是有些技能比其他技能更难学,尤其是那些小菜鸟错误,当你尝试修复它们时可能 ...
- shell编程必须要掌握的命令-xargs
一,说xargs命令前,说一下什么是shell编程 什么是shell编程呢,说白了就是按一定的规则把各种命令组织起来,完成一定的事情.纯属个人理解,哈哈.不管是交互式的shell,还是非交互的shel ...
- Node.js实现用户评论社区(体验前后端开发的乐趣)
前面 接着上一节的内容来,今天我们要完成一个用Node开发后台服务器,实现一个简单的用户评论社区.可以先看下效果图: 开始 建立项目文件夹comment-list,在里面新建一个public文件夹,p ...
- Celery:Monitor
参考文档:http://docs.celeryproject.org/en/latest/userguide/monitoring.html#guide-monitoring