一、Map集合常用的遍历方式:

遍历Map集合的常用方式有三种:使用keySet的方式,使用entrySet的方式,使用values()取值的方式,这三种方式中,都有对应的for循环遍历和Iterator遍历的方式取值。

具体用法如下:

public class MapTest {public static void main(String[] args) {HashMap<Integer,String> map= new HashMap<Integer,String>();for(int i = 0;i < 1000000;i++){map.put(i, "第"+i+"个元素");}//第一种方式:keySet的for循环遍历方式long time1 = System.nanoTime();for(Integer key : map.keySet()){map.get(key);}long time2 = System.nanoTime();//第一种方式:keySet的Iterator遍历方式Iterator<Integer> iterator = map.keySet().iterator();while(iterator.hasNext()){Integer key = iterator.next();map.get(key);}long time3 = System.nanoTime();//第二种方式:entrySet的for循环遍历方式for(Entry<Integer,String>  entry: map.entrySet()){entry.getKey();entry.getValue();}long time4 = System.nanoTime();//第二种方式:entrySet的Iterator遍历方式Iterator<Entry<Integer, String>> iterator2 = map.entrySet().iterator();Entry<Integer, String> entry;while(iterator2.hasNext()){entry = iterator2.next();entry.getKey();entry.getValue();}long time5 = System.nanoTime();//第三种方式:只能得到value,可以用values()返回包含所有value的Collection<T>,不容易得到对应的key//values()方法的for循环遍历方式Collection<String> values = map.values();for(String value : values){}long time6 = System.nanoTime();//values()方法的Iterator遍历方式Iterator<String> iterator3 = map.values().iterator();String value;while(iterator3.hasNext()){value=iterator3.next();}long time7 = System.nanoTime();System.out.println("keySet的for循环遍历方式耗时:" + (time2-time1)/1000 + "微秒");System.out.println("keySet的Iterator遍历方式耗时:" + (time3-time2)/1000 + "微秒");System.out.println("entrySet的for循环遍历方式耗时:" + (time4-time3)/1000 + "微秒");System.out.println("entrySet的Iterator遍历方式耗时:" + (time5-time4)/1000 + "微秒");System.out.println("values()方法的for循环遍历方式耗时:" + (time6-time5)/1000 + "微秒");System.out.println("values()方法的Iterator遍历方式耗时:" + (time7-time6)/1000 + "微秒");}
}

keySet是键的集合,Set里面的类型即key的类型;

entrySet是键-值对的集合,Set里面的类型是Map.Entry,Entry是一个键-值对;

keySet():迭代后只能通过get()取key;

entrySet():迭代后可以e.getKey(),e.getValue()取key和value,返回的是Entry接口;

二、遍历的性能对比:

前面的代码的输出结果如下:

keySet的for循环遍历方式耗时:41822微秒
keySet的Iterator遍历方式耗时:36073微秒
entrySet的for循环遍历方式耗时:31792微秒
entrySet的Iterator遍历方式耗时:25888微秒
values()方法的for循环遍历方式耗时:25264微秒
values()方法的Iterator遍历方式耗时:21215微秒

从上面的输出结果可以看出:

1、在数据元素的数量比较大时,entrySet()方式的遍历效率快于keySet(),有两个原因 :

(1)一个原因是keySet相当于遍历了2次,一次是对key的Set集合的遍历,二次是每次遍历过程都要通过key和map.get(key)来获取value值。

(2)第二个原因是map.get(key)的时候,底层是根据key的hashCode值经过哈希算法得到一个hash值,然后作为索引映射到对应的table数组的索引位置,这是一次密集型计算,很耗费CPU,如果有大量的元素,则会使CPU使用率飙升,影响响应速度,而entrySet()返回的set里面的元素都是Map.Enpty类型,key和value就是这个类的一个属性,entry.getKey()和entry.getValue()效率肯定很高。

2、不过,在数据元素的数量比较小的情况小,keySet()方式的遍历效率快于entrySet()。

3、values()是返回Map的所有value的集合的Collection,只能遍历到value,很难遍历到key,所以一般不用,如果当我们只需要取得value值时,采用values来遍历效率更高。

4、从上面的几种方式的for循环遍历和Iterator遍历的方式耗时结果来看,Iterator遍历的效率会比for循环效率更快一点。

Java集合篇:Map常用遍历方式 以及 性能对比相关推荐

  1. ArrayList 遍历方式及性能对比

    List的几种遍历方式 int num = 1000000;List<Integer> list = new ArrayList<>(); for (int i = 0; i ...

  2. Java集合:set的遍历方式

    对 set 的遍历 1.迭代遍历: Set<String> set = new HashSet<String>(); Iterator<String> it = s ...

  3. Java基础篇 Map循环的方式

    (一)循环例子 Map<String,String> map = new HashMap<String, String>();map.put("pen",& ...

  4. Java8高效遍历map_Java8中Map的遍历方式总结

    在这篇文章中,我将对Map的遍历方式做一个对比和总结,将分别从JAVA8之前和JAVA8做一个遍历方式的对比,亲测可行. public class LambdaMap { private Map ma ...

  5. JS几种数组遍历方式以及性能分析对比

    前言 这一篇与上一篇 JS几种变量交换方式以及性能分析对比 属于同一个系列,本文继续分析JS中几种常用的数组遍历方式以及各自的性能对比 起由 在上一次分析了JS几种常用变量交换方式以及各自性能后,觉得 ...

  6. Java集合篇:Map集合的几种遍历方式及性能测试

    文章目录 一.写在前面 二.正式开始探究之旅 1. Map集合一共有多少种遍历方式呢? 2.那这几种遍历方式的具体用法是啥样的呢? 2.1 keySet()方式遍历-------for循环 2.2 k ...

  7. java map遍历_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

  8. java中两种遍历集合的方式_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

  9. Java集合篇:Map总结

    相关阅读: Java基础篇:hashCode的作用 Java集合篇:HashMap原理详解(JDK1.7及之前的版本) Java集合篇:HashMap原理详解(JDK1.8) Java集合篇:Hash ...

最新文章

  1. python中一共有多少个关键字-python – 搜索多个关键字的字符串列表
  2. OVS技术介绍(四十一)
  3. linux没有mysql.server,[linux]centos7下解决yum install mysql-server没有可用包
  4. spring boot 整合mongoDb
  5. 博客园自定义背景(一)
  6. 【ES】ES 写入数据流程
  7. C++中BEGIN_MSG_MAP或者BEGIN_MESSAGE_MAP的个人理解
  8. 汇编编程环境-MASM6.15版下载
  9. cocosbuilder入门
  10. [Boost.asio] 深入linux网络编程(四):使用asio搭建商用服务器
  11. 固定链接设置朴素正常html无法显示,wordpress固定链接设置修改常见问题
  12. [渝粤教育] 西南科技大学 广告学 在线考试复习资料
  13. maven 打包错误:Please refer to xxx\target\surefire-reports for the individual test results.
  14. 服务器开虚拟机总是gpu满载,vSphere 环境机器学习 GPU 加速方案选型
  15. 微信小程序OTO商城(客户端)
  16. 下载并解密的ts文件,发现一部分ts文件能播放,一部分不能播放
  17. Category 类别 -Objective-C
  18. 真机最小化安装centos7 网卡驱动
  19. 谈谈图书馆知识资源细颗粒度标引中的古籍稿本标引
  20. 服务器中毒了,无法登陆,开启拷贝恢复之路

热门文章

  1. 五十八、如何对一个数进行分解质因数
  2. 三十三、Java集合中的LinkedList
  3. 复旦大学张奇组:对话摘要数据不足?对话数据、文档摘要数据,我全都要!...
  4. 中国AI论文,爆了!
  5. 图马尔可夫网络:融合统计关系学习与图神经网络
  6. 多目标跟踪(MOT)领域近期值得读的几篇论文
  7. 本期最新 9 篇论文,每一篇都想推荐给你 | PaperDaily #14
  8. AI识虫:林业病虫害数据集和数据预处理方法
  9. mysql数据库约束无符号,MySQL所支持的数据类型与表字段约束类型的学习教程
  10. html登录界面设计代码_.NET 5 开发WPF - 美食应用登录UI设计