千家信息网

怎么使用HashMap的循环

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容介绍了"怎么使用HashMap的循环"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先来看看每
千家信息网最后更新 2025年11月08日怎么使用HashMap的循环

本篇内容介绍了"怎么使用HashMap的循环"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

先来看看每种遍历的方式:

在for循环中使用entries实现Map的遍历

public static void forEachEntries() {         for (Map.Entry entry : map.entrySet()) {             String mapKey = entry.getKey();             String mapValue = entry.getValue();         }     }

在for循环中遍历key

public static void forEachKey() {         for (String key : map.keySet()) {             String mapKey = key;             String mapValue = map.get(mapKey);         }     }

在for循环中遍历value

public static void forEachValues() {         for (String key : map.values()) {             String val = key;         }     }

Iterator遍历

public static void forEachIterator() {         Iterator> entries = map.entrySet().iterator();         while (entries.hasNext()) {             Entry entry = entries.next();             String key = entry.getKey();             String value = entry.getValue();         }     }

forEach jdk1.8遍历

public static void forEach() {         map.forEach((key, val) -> {             String key1 = key;             String value = val;         });     }

Stream jdk1.8遍历

map.entrySet().stream().forEach((entry) -> {             String key = entry.getKey();             String value = entry.getValue();         });

Streamparallel jdk1.8遍历

public static void forEachStreamparallel() {         map.entrySet().parallelStream().forEach((entry) -> {             String key = entry.getKey();             String value = entry.getValue();         });     }

以上就是常见的对于map的一些遍历的方式,下面我们来写个测试用例来看下这些遍历方式,哪些是效率最好的。下面测试用例是基于JMH来测试的 首先引入pom

             org.openjdk.jmh             jmh-core             1.23                               org.openjdk.jmh             jmh-generator-annprocess             1.23             provided         

关于jmh测试如可能会影响结果的一些因素这里就不详细介绍了,可以参考文末的第一个链接写的非常详细。以及测试用例为什么要这么写(都是为了消除JIT对测试代码的影响)这是参照官网的链接:编写测试代码如下:

package com.workit.autoconfigure.autoconfigure.controller;   import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import org.openjdk.jmh.results.format.ResultFormatType; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder;  import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; import java.util.concurrent.TimeUnit;  /**  * @author:公众号:java金融  * @Date:   * @Description:微信搜一搜【java金融】回复666  */  @State(Scope.Thread) @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class InstructionsBenchmark {     public static void main(String[] args) throws RunnerException {         Options opt = new OptionsBuilder().include(InstructionsBenchmark.class.getSimpleName()).result("result.json").resultFormat(ResultFormatType.JSON).build();         new Runner(opt).run();     }      static final int BASE = 42;      static int add(int key,int val) {       return  BASE + key +val;     }     @Param({"1", "10", "100", "1000","10000","100000"})     int size;     private static Map  map;      // 初始化方法,在全部Benchmark运行之前进行     @Setup(Level.Trial)     public void init() {         map = new HashMap<>(size);         for (int i = 0; i < size; i++) {             map.put(i, i);         }     }       /**      * 在for循环中使用entries实现Map的遍历:      */     @Benchmark     public static void forEachEntries(Blackhole blackhole) {         for (Map.Entry entry : map.entrySet()) {             Integer mapKey = entry.getKey();             Integer mapValue = entry.getValue();             blackhole.consume(add(mapKey,mapValue));         }     }      /**      * 在for循环中遍历key      */     @Benchmark     public static StringBuffer forEachKey(Blackhole blackhole) {         StringBuffer stringBuffer = new StringBuffer();         for (Integer key : map.keySet()) {           //  Integer mapValue = map.get(key);             blackhole.consume(add(key,key));         }         return stringBuffer;     }      /**      * 在for循环中遍历value      */     @Benchmark     public static void forEachValues(Blackhole blackhole) {         for (Integer key : map.values()) {             blackhole.consume(add(key,key));         }     }      /**      * Iterator遍历;      */     @Benchmark     public static void forEachIterator(Blackhole blackhole) {         Iterator> entries = map.entrySet().iterator();         while (entries.hasNext()) {             Entry entry = entries.next();             Integer key = entry.getKey();             Integer value = entry.getValue();             blackhole.consume(add(key,value));         }     }      /**      * forEach jdk1.8遍历      */     @Benchmark     public static void forEachLamada(Blackhole blackhole) {         map.forEach((key, value) -> {             blackhole.consume(add(key,value));         });      }      /**      * forEach jdk1.8遍历      */     @Benchmark     public static void forEachStream(Blackhole blackhole) {         map.entrySet().stream().forEach((entry) -> {             Integer key = entry.getKey();             Integer value = entry.getValue();             blackhole.consume(add(key,value));          });     }      @Benchmark     public static void forEachStreamparallel(Blackhole blackhole) {         map.entrySet().parallelStream().forEach((entry) -> {             Integer key = entry.getKey();             Integer value = entry.getValue();             blackhole.consume(add(key,value));          });     }  }

运行结果如下:「注:运行环境idea 2019.3,jdk1.8,windows7 64位。」

Benchmark                                    (size)  Mode  Cnt        Score        Error  Units InstructionsBenchmark.forEachEntries              1  avgt    5       10.021 ±      0.224  ns/op InstructionsBenchmark.forEachEntries             10  avgt    5       71.709 ±      2.537  ns/op InstructionsBenchmark.forEachEntries            100  avgt    5      738.873 ±     12.132  ns/op InstructionsBenchmark.forEachEntries           1000  avgt    5     7804.431 ±    136.635  ns/op InstructionsBenchmark.forEachEntries          10000  avgt    5    88540.345 ±  14915.682  ns/op InstructionsBenchmark.forEachEntries         100000  avgt    5  1083347.001 ± 136865.960  ns/op InstructionsBenchmark.forEachIterator             1  avgt    5       10.675 ±      2.532  ns/op InstructionsBenchmark.forEachIterator            10  avgt    5       73.934 ±      4.517  ns/op InstructionsBenchmark.forEachIterator           100  avgt    5      775.847 ±    198.806  ns/op InstructionsBenchmark.forEachIterator          1000  avgt    5     8905.041 ±   1294.618  ns/op InstructionsBenchmark.forEachIterator         10000  avgt    5    98686.478 ±  10944.570  ns/op InstructionsBenchmark.forEachIterator        100000  avgt    5  1045309.216 ±  36957.608  ns/op InstructionsBenchmark.forEachKey                  1  avgt    5       18.478 ±      1.344  ns/op InstructionsBenchmark.forEachKey                 10  avgt    5       76.398 ±     12.179  ns/op InstructionsBenchmark.forEachKey                100  avgt    5      768.507 ±     23.892  ns/op InstructionsBenchmark.forEachKey               1000  avgt    5    11117.896 ±   1665.021  ns/op InstructionsBenchmark.forEachKey              10000  avgt    5    84871.880 ±  12056.592  ns/op InstructionsBenchmark.forEachKey             100000  avgt    5  1114948.566 ±  65582.709  ns/op InstructionsBenchmark.forEachLamada               1  avgt    5        9.444 ±      0.607  ns/op InstructionsBenchmark.forEachLamada              10  avgt    5       76.125 ±      5.640  ns/op InstructionsBenchmark.forEachLamada             100  avgt    5      861.601 ±     98.045  ns/op InstructionsBenchmark.forEachLamada            1000  avgt    5     7769.714 ±   1663.914  ns/op InstructionsBenchmark.forEachLamada           10000  avgt    5    73250.238 ±   6032.161  ns/op InstructionsBenchmark.forEachLamada          100000  avgt    5   836781.987 ±  72125.745  ns/op InstructionsBenchmark.forEachStream               1  avgt    5       29.113 ±      3.275  ns/op InstructionsBenchmark.forEachStream              10  avgt    5      117.951 ±     13.755  ns/op InstructionsBenchmark.forEachStream             100  avgt    5     1064.767 ±     66.869  ns/op InstructionsBenchmark.forEachStream            1000  avgt    5     9969.549 ±    342.483  ns/op InstructionsBenchmark.forEachStream           10000  avgt    5    93154.061 ±   7638.122  ns/op InstructionsBenchmark.forEachStream          100000  avgt    5  1113961.590 ± 218662.668  ns/op InstructionsBenchmark.forEachStreamparallel       1  avgt    5       65.466 ±      5.519  ns/op InstructionsBenchmark.forEachStreamparallel      10  avgt    5     2298.999 ±    721.455  ns/op InstructionsBenchmark.forEachStreamparallel     100  avgt    5     8270.759 ±   1801.082  ns/op InstructionsBenchmark.forEachStreamparallel    1000  avgt    5    16049.564 ±   1972.856  ns/op InstructionsBenchmark.forEachStreamparallel   10000  avgt    5    69230.849 ±  12169.260  ns/op InstructionsBenchmark.forEachStreamparallel  100000  avgt    5   638129.559 ±  14885.962  ns/op InstructionsBenchmark.forEachValues               1  avgt    5        9.743 ±      2.770  ns/op InstructionsBenchmark.forEachValues              10  avgt    5       70.761 ±     16.574  ns/op InstructionsBenchmark.forEachValues             100  avgt    5      745.069 ±    329.548  ns/op InstructionsBenchmark.forEachValues            1000  avgt    5     7772.584 ±   1702.295  ns/op InstructionsBenchmark.forEachValues           10000  avgt    5    74063.468 ±  23752.678  ns/op InstructionsBenchmark.forEachValues          100000  avgt    5   994057.370 ± 279310.867  ns/op

我们可以发现,数据量较小的时候forEachEntries和forEachIterator、以及lamada循环效率都差不多forEachStreamarallel的效率反而较低,只有当数据量达到10000以上parallelStream的优势就体现出来了。所以平时选择使用哪种循环方式的时候没必要太纠结哪一种方式,其实每种方式之间的效率还是微乎其微的。选择适合自己的就好。

"怎么使用HashMap的循环"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

循环 测试 方式 效率 运行 代码 内容 数据 时候 更多 知识 结果 金融 链接 影响 选择 实用 必要 微乎其微 学有所成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 原神小米账号是什么服务器 modbustcp客户端和服务器端区别 防范网络安全心得体会 江苏工业软件开发如何收费 iosapp软件开发哪家正规 返回数据库表的第一个字段 网络安全新型冠状病毒的形势 比特币网络安全模式怎么调 保存文件的数据库软件 地下服务器 未来教育三级网络技术激活器 openkm数据库 导入数据库文件太大怎么办 orcle数据库中如何输出 浙江服务器回收费用多少 一周网络安全维护多少钱 中农惠民集团软件开发商 软件数据库连接配置文件 贵州专业软件开发进销存 靖江进口网络技术诚信合作 成都网络安全培训班哪家好 pd软件开发 四川it软件开发多少钱 服务器不需要调制解调器吗 数据库和程序分离 福山区直播软件开发解决方案 软件开发零基础入门学习文本 软件开发需求意向确认书 网络安全为人民流程 服务器远程不能修改文件
0