入职新公司,查看代码规范的时候,看到一条:
“Map 遍历慎用 Map.forEach()”
举了一个内网例子:一个 Map<String, ObjectDTO> 元素大小为 7 ,遍历:
使用 forEach:耗时 100ms 左右
使用 iterator:耗时 1ms 左右
自己以 HashMap 为例在本地做了一下测试,确实直接使用迭代器 Iterator 遍历速度比 forEach 快很多。但是测试过程发现, forEach 只是第一次运行的时候会慢一些,后面再次执行速率和Iterator相差无几;而且假如使用了 forEach() 遍历了 Map<String,X>,那么后续使用 forEach() 遍历 Map<Y,Z> 速度也会很快(X,Y,Z 为任意类型)。个人猜测应该是Java JIT 对 forEach() 代码做了处理,是不是把它搞成了热点代码。
后来搜了一下,发现一篇文章:为java8的foreach正名,里面测试就先给 forEach 代码进行了预热。如果一定要JVM预热一次的话,那是不是第一次执行 forEach 代码速率较慢从而可能拖慢一次请求,但由上面个人测试来看应该只会慢一次。感觉这个还是有点意思的,记录一下吧。