结论:一般情况下推荐使用enterSet的for循环(即以下的方法2),如果只是取key值可以使用keySet性能会更好。

因为keySet只取key,enterSet即取了key又取了value。

  1. public static void main(String[] args) throws Exception {
  2. ConcurrentHashMap<Long, ReqPacket> r = new ConcurrentHashMap<Long, ReqPacket>();
  3. long size = 2000000;
  4. // 方法1
  5. for (long i = 0; i < size; i++) {
  6. r.put(i, new ReqPacket());
  7. }
  8. System.out.println("方法1开始执行数:" + r.size());
  9. long t1 = System.currentTimeMillis();
  10. Iterator<Entry<Long, ReqPacket>> iter2 = r.entrySet().iterator();
  11. while (iter2.hasNext()) {
  12.  
  13. // ReqPacket value=iter2.next().getValue();
  14. r.remove(iter2.next().getKey());
  15. }
  16. System.out.println("方法1 entrySet hasNext 执行时间:" + (System.currentTimeMillis() - t1) + " 结束数量:" + r.size());
  17.  
  18. // 方法2
    //推荐方法
  19. for (long i = 0; i < size; i++) {
  20. r.put(i, new ReqPacket());
  21. }
  22. System.out.println("方法2开始执行数:" + r.size());
  23. long t2 = System.currentTimeMillis();
  24. for (Entry<Long, ReqPacket> entry2 : r.entrySet()) {
  25. ReqPacket value = entry2.getValue();
  26. r.remove(entry2.getKey());
  27. }
  28. System.out.println("方法2 entrySet for 执行时间:" + (System.currentTimeMillis() - t2) + " 结束数量:" + r.size());
  29.  
  30. // 方法3
  31. for (long i = 0; i < size; i++) {
  32. r.put(i, new ReqPacket());
  33. }
  34. System.out.println("方法3开始执行数:" + r.size());
  35. long t3 = System.currentTimeMillis();
  36. for (Long key : r.keySet()) {
  37. ReqPacket value = r.get(key);
  38. r.remove(key);
  39. }
  40. System.out.println("方法3 keySet for 执行时间:" + (System.currentTimeMillis() - t3) + " 结束数量:" + r.size());
  41.  
  42. // 方法4
  43. for (long i = 0; i < size; i++) {
  44. r.put(i, new ReqPacket());
  45. }
  46. System.out.println("方法4开始执行数:" + r.size());
  47. long t4 = System.currentTimeMillis();
  48. Iterator<Long> iter = r.keySet().iterator();
  49. while (iter.hasNext()) {
  50. // ReqPacket value = r.get(iter.next());
  51. r.remove(iter.next());
  52. }
  53. System.out.println("方法4 keySet hasNext 执行时间:" + (System.currentTimeMillis() - t4) + " 结束数量:" + r.size());
  54. }

测试结果:

  1. 方法1开始执行数:2000000
  2. 方法1 entrySet hasNext 执行时间:194 结束数量:0
  3. 方法2开始执行数:2000000
  4. 方法2 entrySet for 执行时间:175 结束数量:0
  5. 方法3开始执行数:2000000
  6. 方法3 keySet for 执行时间:230 结束数量:0
  7. 方法4开始执行数:2000000
  8. 方法4 keySet hasNext 执行时间:104 结束数量:0

map遍历测试结果的更多相关文章

  1. map遍历的四种方式

    原文 http://blog.csdn.net/dayanxuqun/article/details/26348277 以下是map遍历的四种方式: // 一.推荐只用value的时候用,都懂的... ...

  2. java的Map遍历

    java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个mappublic ...

  3. java map遍历方式及效率

    本文转载自Java Map遍历方式的选择. 只给出遍历方式及结论.测试数据可以去原文看. 如果你使用HashMap 同时遍历key和value时,keySet与entrySet方法的性能差异取决于ke ...

  4. 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历

    分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...

  5. js中三个对数组操作的函数 indexOf()方法 filter筛选 forEach遍历 map遍历

     indexOf()方法  indexOf()方法返回在该数组中第一个找到的元素位置,如果它不存在则返回-1. 不使用indexOf时 var arr = ['apple','orange','pea ...

  6. 原生JS forEach()和map()遍历的区别以及兼容写法

    一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...

  7. map遍历性能记录

    map遍历可以通过keySet或者entrySet方式. 性能上:entrySet略胜一筹,原因是keySet获取到key后再根据key去获取value,在查一遍,所以慢一些. keySet: //先 ...

  8. forEach() 和 map() 遍历

    1.forEach()   没有返回值. arr[].forEach(function(value,index,array){ //do something }) 参数:value数组中的当前项, i ...

  9. js的map遍历和array遍历

    1. array遍历: [1].forEach() forEach是ES5中操作数组的一种方法,主要功能是遍历数组.forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第 ...

随机推荐

  1. 出现Fatal IO error 11 (资源暂时不可用) on X server :0.0.的可能原因及解决方案

    我在使用python的过程当中发现了这个有这样的错误,后来看了下面这篇文档才知道原因所在. 最近在编写一个局域网的聊天工具,在编写客户端时,我把界面部分和事件处理函数写好后,准备再开一个线程用于接收服 ...

  2. OCR是用来做什么的

    OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译成 ...

  3. IE10、IE11 无法写入Cookie

    IE10.IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题 你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的, ...

  4. unity, SkinnedMeshRenderer.updateWhenOffscreen

    发现,必须勾选update when offscreen,当skinnedMeshRenderer发生形变时bounds才会更新.

  5. 理解AngularJS的作用域Scope

    AngularJS中,子作用域一般都会通过JavaScript原型继承机制继承其父作用域的属性和方法.但有一个例外:在directive中使用scope: { ... },这种方式创建的作用域是一个独 ...

  6. python3倒叙字符串

    google测试工程师的一道题: 设计一个函数,使用任意语言,完成以下功能: 一个句子,将句子中的单词全部倒排过来,但单词的字母顺序不变.比如,This is a real world,输出结果为 w ...

  7. centos7 关闭SELINUX 防火墙

    关闭SELINUXvi /etc/selinux/config#SELINUX=enforcing #注释掉#SELINUXTYPE=targeted #注释掉SELINUX=disabled #增加 ...

  8. get跟post编码--转

    1.Get是用来从服务器上获得数据(没有请求体),而Post是用来向服务器上传递数据(包含请求体). 2.Get将表单中数据的按照variable=value的形式,添加到action(服务)所指向的 ...

  9. R(三): R包原理及安装

    包(package)是多个函数的集合,常作为分享代码的基本单元,代码封装成包可以方便其他用户使用.越来越多的R包正在由世界上不同的人所创建并分发,这些分发的R包,可以从CRAN 或 github 上获 ...

  10. 构建VIM下的C++编程环境

    1.VIM配置 Vim强大的配置与功能,其来源基本上就两个地方:Vim插件以及Vim配置文件. Vim本身的系统配置文件夹是在/usr/share/vim/和/etc/vim/两个文件夹下.一般情况下 ...