​今天不举例子了,问一句你开心吗?不开心也要记得把开心的事情放到快乐源泉小瓶子里,偶尔拿出来一一遍历看看。

Map在我们Java程序员高频使用的一种数据结构,Map的遍历方式也有很多种,那那种方式比较高效呢,今天就带大家一起验证下。

先说一下阿里巴巴Java开发手册的建议:

【推荐】使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历。

说明:keySet其实遍历了2次,一次是转换为Iterator对象,另一次是从hashMap种取出key对应的value。如果是JDK8,使用Map.forEash方法。

1:通过for和map.entrySet()方式遍历。

// Map初始化
private static Map<String,Integer> initMap(int count){
AlternativeJdkIdGenerator alternativeJdkIdGenerator = new AlternativeJdkIdGenerator();
Map<String,Integer> map = new HashMap<>();
for (int i = 0; i < count; i++) {
map.put(alternativeJdkIdGenerator.generateId().toString(),i) ;
}
return map ;
}
int count = 1000000;
Map<String,Integer> map =initMap(count) ;
// 为了计算平均值,分别循环三次进行遍历
for (int i = 0; i < 3; i++) {
Instant start;
Instant end;
start = Instant.now();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
// 一般遍历map就是获取key和value
String result="key为:"+entry.getKey()+",value为:"+entry.getValue();
}
end = Instant.now();
System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
}

运行三次的结果如下:(平均值:368.33ms)

​2、通过 for, Iterator 和 map.entrySet() 来遍历

  int count = 1000000;
Map<String,Integer> map =initMap(count) ;
for (int i = 0; i < 3; i++) {
Instant start;
Instant end;
start = Instant.now();
for (Iterator<Map.Entry<String,Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) {
Map.Entry<String,Integer> entry = entries.next();
String result ="key为:"+entry.getKey()+",value为:"+entry.getValue();
}
end = Instant.now();
System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
}

​运行三次的结果如下:(平均值:339.66ms)

​3、通过 for 和 map.keySet() 来遍历

 int count = 1000000;
Map<String,Integer> map =initMap(count) ;
for (int i = 0; i < 3; i++) {
Instant start;
Instant end;
start = Instant.now();
for (String key : map.keySet()) {
String result ="key为:"+key+",value为:"+map.get(key);
}
end = Instant.now();
System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
}

运行三次的结果如下:(平均值:379.66ms)

​4、通过 for,Iterator 和 map.keySet() 来遍历

  int count = 1000000;
Map<String,Integer> map =initMap(count) ;
for (int i = 0; i < 3; i++) {
Instant start;
Instant end;
start = Instant.now();
for (Iterator<String> key = map.keySet().iterator(); key.hasNext(); ) {
String k = key.next();
String result ="key为:"+k+",value为:"+map.get(k);
}
end = Instant.now();
System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
}

运行三次的结果如下:(平均值330.33ms)

5、通过 map.forEach() 来遍历

int count = 1000000;
Map<String,Integer> map =initMap(count) ;
for (int i = 0; i < 3; i++) {
Instant start;
Instant end;
start = Instant.now();
map.forEach((key, value) -> {
String result ="key为:"+key+",value为:"+map.get(value);
});
end = Instant.now();
System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
}

​运行三次的结果如下:(平均值506.33ms)

​经过上面的验证(在大批量数据的时候,数据量小的时候没测试,感觉数据量小的化耗时太小更不好比较)最好不要用map.forEach()来遍历Map。在普通的遍历方法中 entrySet() 的方法要比使用 keySet() 的方法好。【PS虽然keySet() 的平均值有时候比较小,但它的波动性比较大,所以还是考虑阿里巴巴Java开发手册的建议使用entrySet()遍历Map】。

看过 HashMap 源码的同学应该会发现,这个遍历方式【entrySet(】在源码中也有使用,如下图所示。

 

​Spring的源码也有很多的Map,大神们遍历的方式也都基本使用entrySet()遍历如下:

所以开发中也建议使用entrySet()来遍历Map。

阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用的更多相关文章

  1. 遍历HashMap常用的的三种方式

    遍历HashMap常用的的三种方式 HashMap是我们使用非常多的集合之一,下面就来介绍几种常用的HashMap的遍历方式. 1.首先定义一个新的HashMap,并往里面添加一些数据. HashMa ...

  2. 遍历Map和List的几种方法和性能比较

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...

  3. 遍历Map集合:java.util.Map.Entry、KeySet两种方式

    遍历Map集合的两种方式: 1.用KeySet Map.keySet(),返回一个存放所有key的set集合,通过遍历集合,根据key值取出所有的value值. Map<String,Strin ...

  4. 遍历 Dictionary,你会几种方式?

    一:背景 1. 讲故事 昨天在 StackOverflow 上看到一个很有趣的问题,说: 你会几种遍历字典的方式,然后跟帖就是各种奇葩的回答,挺有意思,马上就要国庆了,娱乐娱乐吧,说说这种挺无聊的问题 ...

  5. Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 :这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> m ...

  6. 【转】Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> ma ...

  7. 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合

    package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...

  8. (1)集合 ---遍历map集合

    Map接口     实现Map接口的类用来存储键(key)-值(value) 对.Map 接口的实现类有HashMap和TreeMap等.Map类中存储的键-值对通过键来标识,所以键值不能重复. Ha ...

  9. Java中遍历Map的四种方式

    Demo如下 Map<String, String> map = new HashMap<>(); map.put("key1","data1&q ...

  10. Java Array数组 遍历 四种方式(包含 Lambda 表达式遍历)

    示例代码如下: package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date ...

随机推荐

  1. 线程池使用、countDownLatch、以及数据库批量插入 添加配置优化插入与计算

    //新建线程池ThreadPoolExecutor cpuThreadPoolExecutor = ThreadUtil.getCpuThreadPoolExecutor(); //使用Countdo ...

  2. Chorme 兼容

    Chorme自动更新,不知道什么时候版本 就变了.之前好用的代码,突然不好用了. 启动时提示Only local connections are allowed 检查一下兼容性参照下文,下载对应的Dr ...

  3. redies概述

    1.redis下载路径 Windows:https://github.com/tporadowski/redis/releases Linux:http://redis.io/download 2.安 ...

  4. 消息队列 RocketMQ4.x介绍和新概念讲解

    消息队列 RocketMQ4.x介绍和新概念讲解 Apache RocketMQ作为阿里开源的一款高性能.高吞吐量的分布式消息中间件 RocketMQ4.x特点 支持Broker和Consumer端消 ...

  5. 【转】Thunderbird 设置转移

    此文章可能已经过时. 此文章的原文版本已经做出了重大更动.在此页面更新前,您可能也会觉得这个有用:Profiles - Where Thunderbird stores your messages a ...

  6. vscode配置c++环境(超简单)

    vscode配置c++环境(超简单) 超简单!!! 配置c++最麻烦的就是mingw的环境,有很多不同的版本,很杂乱,这里我们用最简单的办法展示. 下载一个devc++. 如果你问我,为什么下了dev ...

  7. Microsoft.CppCommon.targets(138,5): error MSB3073

    我生成 Zlib 库的某个项目的时候,出现了这些error,原来是项目属性---->生成后事件--->命令行 错误的内容就是命令行内容.这些命令行的具体作用我还不知道,但是把他们删除后就成 ...

  8. 华为ME60 配置PPPOE-radius 业务

    华为ME60 配置PPPOE-radius 业务 1.创建radius 认证 # radius-server source interface LoopBack0 radius-server grou ...

  9. GreenPlum tidb 性能比较

    主要的需求 针对大体量表的OLAP统计查询,需要找到一个稳定,高性能的大数据数据库,具体使用 数据可以实时的写入和查询,并发的tps不是很高 建立数据仓库,模式上主要采用星星模型.雪花模型,或者宽表 ...

  10. .NET实验三

    实验名称:实验三 Windows 应用程序开发 一. 实验目的 1. 掌握窗口控件的使用方法: 2. 掌握 Windows 的编程基础. 二. 实验要求   根据要求,编写 C#程序,并将程序代码和运 ...