怎么使用HashMap的循环
发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,本篇内容介绍了"怎么使用HashMap的循环"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先来看看每
千家信息网最后更新 2024年11月14日怎么使用HashMap的循环
本篇内容介绍了"怎么使用HashMap的循环"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
先来看看每种遍历的方式:
在for循环中使用entries实现Map的遍历
public static void forEachEntries() { for (Map.Entryentry : 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 Mapmap; // 初始化方法,在全部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安全错误
数据库的锁怎样保障安全
百度时代网络技术是外包吗
wamp 服务器离线
无线路由器 服务器无响应
太仓创新软件开发流程
战地5服务器在哪买
批量提取数据库过程中代码
邢台企业云软件开发
自动化专业学的软件开发
数据库中的实体验证
王者荣耀软件开发工资多少
大数据服务器机箱怎么卖
网络技术赚钱平台
主流网络安全企业
香肠派对服务器二次崩溃
诏安哪里有软件开发
烟草行业网络安全事件
芝麻开门网络技术有限公司
数据库完整性约束实现步骤
派出所网络安全机制
只做软件开发语言学c吗
计算机网络技术学习笔记手写
网络安全周书签
网络技术员实习周记
以下哪种服务器
怎么写数据库
举办全市信息化网络安全
联想服务器怎么进入安全系统
怎么存进数据库中
软件开发合同协议样本
网络安全协议禁用怎么办