map遍历测试结果
结论:一般情况下推荐使用enterSet的for循环(即以下的方法2),如果只是取key值可以使用keySet性能会更好。
因为keySet只取key,enterSet即取了key又取了value。
public static void main(String[] args) throws Exception {
ConcurrentHashMap<Long, ReqPacket> r = new ConcurrentHashMap<Long, ReqPacket>();
long size = 2000000;
// 方法1
for (long i = 0; i < size; i++) {
r.put(i, new ReqPacket());
}
System.out.println("方法1开始执行数:" + r.size());
long t1 = System.currentTimeMillis();
Iterator<Entry<Long, ReqPacket>> iter2 = r.entrySet().iterator();
while (iter2.hasNext()) {
// ReqPacket value=iter2.next().getValue();
r.remove(iter2.next().getKey());
}
System.out.println("方法1 entrySet hasNext 执行时间:" + (System.currentTimeMillis() - t1) + " 结束数量:" + r.size());
// 方法2
//推荐方法
for (long i = 0; i < size; i++) {
r.put(i, new ReqPacket());
}
System.out.println("方法2开始执行数:" + r.size());
long t2 = System.currentTimeMillis();
for (Entry<Long, ReqPacket> entry2 : r.entrySet()) {
ReqPacket value = entry2.getValue();
r.remove(entry2.getKey());
}
System.out.println("方法2 entrySet for 执行时间:" + (System.currentTimeMillis() - t2) + " 结束数量:" + r.size());
// 方法3
for (long i = 0; i < size; i++) {
r.put(i, new ReqPacket());
}
System.out.println("方法3开始执行数:" + r.size());
long t3 = System.currentTimeMillis();
for (Long key : r.keySet()) {
ReqPacket value = r.get(key);
r.remove(key);
}
System.out.println("方法3 keySet for 执行时间:" + (System.currentTimeMillis() - t3) + " 结束数量:" + r.size());
// 方法4
for (long i = 0; i < size; i++) {
r.put(i, new ReqPacket());
}
System.out.println("方法4开始执行数:" + r.size());
long t4 = System.currentTimeMillis();
Iterator<Long> iter = r.keySet().iterator();
while (iter.hasNext()) {
// ReqPacket value = r.get(iter.next());
r.remove(iter.next());
}
System.out.println("方法4 keySet hasNext 执行时间:" + (System.currentTimeMillis() - t4) + " 结束数量:" + r.size());
}
测试结果:
方法1开始执行数:2000000
方法1 entrySet hasNext 执行时间:194 结束数量:0
方法2开始执行数:2000000
方法2 entrySet for 执行时间:175 结束数量:0
方法3开始执行数:2000000
方法3 keySet for 执行时间:230 结束数量:0
方法4开始执行数:2000000
方法4 keySet hasNext 执行时间:104 结束数量:0
map遍历测试结果的更多相关文章
- map遍历的四种方式
原文 http://blog.csdn.net/dayanxuqun/article/details/26348277 以下是map遍历的四种方式: // 一.推荐只用value的时候用,都懂的... ...
- java的Map遍历
java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个mappublic ...
- java map遍历方式及效率
本文转载自Java Map遍历方式的选择. 只给出遍历方式及结论.测试数据可以去原文看. 如果你使用HashMap 同时遍历key和value时,keySet与entrySet方法的性能差异取决于ke ...
- 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历
分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...
- 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,当前 ...
- map遍历性能记录
map遍历可以通过keySet或者entrySet方式. 性能上:entrySet略胜一筹,原因是keySet获取到key后再根据key去获取value,在查一遍,所以慢一些. keySet: //先 ...
- forEach() 和 map() 遍历
1.forEach() 没有返回值. arr[].forEach(function(value,index,array){ //do something }) 参数:value数组中的当前项, i ...
- js的map遍历和array遍历
1. array遍历: [1].forEach() forEach是ES5中操作数组的一种方法,主要功能是遍历数组.forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第 ...
随机推荐
- javascript闭包实例
实例一 //每次执行一次c()i加1.关键在于var c=a():c容器将i装载记住了. function a(){ var i=0; function b(){ alert(++i); } retu ...
- InnoDB Double write
记得刚开始看InnoDB文档的时候,Double Write一节(其实只有一小段)就让我很困惑.无奈当时内力太浅,纠缠了很久也没弄明白.时隔几个月,重新来整理一下. 涉及到的概念:Buffer Poo ...
- datagrid中load,reload,loadData方法的区别
它有其中有load,reload,loadData这三个方法,它们都有相同的功能,都是加载数据的,但又有区别. load方法,比如我已经定义一个datagrid的id为grid,那这个方法的使用方式为 ...
- java中abstract
abstract(抽象)修饰符,可以修饰类和方法 1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半 ...
- libc-glibc
glibc 和 libc 都是 Linux 下的 C 函数库. libc 是 Linux 下的 ANSI C 函数库:glibc 是 Linux 下的 GUN C 函数库. ANSI C 和 GNU ...
- linux包之sysstat之mpstat与pidstat命令
概述 [root@localhost ~]# rpm -qa|grep sysstsysstat-9.0.4-22.el6.x86_64mpstat是MultiProcessor Statistics ...
- 【转】个人最常用的Eclipse快捷键
记录下自己在Eclipse中最常使用的快捷键: 其实网上总结多的是,自己记录下自己平时最切身受益的一些快捷键. 1.SHIFT+ ALT+Z(刚学的): 条件:选中一段代码 会弹出上面的右键菜单, ...
- 微信 JSSDK .NET版
/*因为官方 微信 JSSDK 只有PHP java版本的 我自己照着PHP的翻译过来的,可供参考.欢迎指正*/ [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 ...
- 编译工程时报illegal character:\65279--转
windows对UTF-8文件进行了特殊处理,对UTF-8的文本文件自动在前面加了三个byte(EF BB BF),javac编译时,读到最前面这三个byte时报错 illegal character ...
- [转][工地][存]Oracle触发器死锁问题解决
摘自http://blog.itpub.net/12932950/viewspace-607691/ 这两天一直在因为系统初期设计原因导致的一个触发器问题.问题如下:有表T,有客户编号.账户编号及地址 ...