场景
Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化:
Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_java热点函数
参考以上性能测试工具的使用。下面针对Java中对HashMap的7种遍历方式做性能测试。
实现
Java中HashMap遍历的方式
HashMap遍历,从大的方向来说,可分为以下4类:
1、迭代器(Iterator)方式遍历
2、For Each方式遍历
3、Lambda表达式遍历(JDK 1.8+)
4、Streams API遍历(JDK1.8+)
但每种类型下又有不同的实现方式,因此具体的遍历⽅式又可以分为以下7种:
1. 使⽤迭代器(Iterator)EntrySet 的⽅式进⾏遍历;
2. 使⽤迭代器(Iterator)KeySet 的⽅式进⾏遍历;
3. 使⽤ For Each EntrySet 的⽅式进⾏遍历;
4. 使⽤ For Each KeySet 的⽅式进⾏遍历;
5. 使⽤ Lambda 表达式的⽅式进⾏遍历;
6. 使⽤ Streams API 单线程的⽅式进⾏遍历;
7. 使⽤ Streams API 多线程的⽅式进⾏遍历。
Java中7种遍历HashMap方式性能测试
编写如下测试类
运行测试类
所有被添加了 @Benchmark 注解的⽅法都会被测试,因为 parallelStream 为多线程版本性能⼀定是最好的,所以就不参与测试了
测试结果
//Benchmark Mode Cnt Score Error Units
//HashMapCycleTest.EntrySetForEach avgt 5 543.154 ± 36.365 ns/op
//HashMapCycleTest.ForEachEntrySet avgt 5 533.511 ± 42.878 ns/op
//HashMapCycleTest.ForEachKeySet avgt 5 805.146 ± 118.210 ns/op
//HashMapCycleTest.KeySetForEach avgt 5 785.286 ± 68.913 ns/op
//HashMapCycleTest.LambdaForEach avgt 5 429.048 ± 47.000 ns/op
//HashMapCycleTest.StreamSingle avgt 5 501.687 ± 25.401 ns/op
结论:
从以上结果可以看出, lambda表达式和两个entrySet的性能相近,并且执⾏速度最快,接下来是 stream ,
然后是两个 keySet 。如果从性能⽅⾯考虑,我们应该尽量使⽤ lambda 或者是 entrySet 来遍历 Map 集合。