Java Map 的 forEach 函数遍历

博客讨论了在Java中Map遍历时,使用forEach方法相对于iterator的性能差异。首次使用forEach可能会较慢,但后续执行速度能提升,可能是由于JIT编译优化。文章提到了预热代码对性能的影响,并指出这个问题可能只会影响首次请求。作者建议理解并根据实际情况选择遍历方式。
摘要由CSDN通过智能技术生成

入职新公司,查看代码规范的时候,看到一条:

“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 代码速率较慢从而可能拖慢一次请求,但由上面个人测试来看应该只会慢一次。感觉这个还是有点意思的,记录一下吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值