我使用JProfiler
来分析我的应用程序,因为它是一个巨大的应用程序,所以我非常了解它的性能和效率。
这花了太长时间,所以我用Iterator.hasNext
替换所有for-each
,但是当我在JProfilers CPU视图中看到它显示我调用的Iterator.hasNext
方法for-each
。
为什么这样?这两者之间有什么关系吗?
以下是示例代码:
List<Map<String, Object>> mapList = jdbcTemplate
.queryForList(MAP.SELECT_ALL);
for (Map<String, Object> map : mapList) {
list.add(fillPreferenceMaster(preferenceMasterMap));
}
答案 0 :(得分:10)
是的,增强型for
语句使用了Iterator
可覆盖的集合,请参阅Section 14.14.2 of the JLS:
如果 Expression 的类型是
Iterable
的子类型,那么让 I 成为表达式 Expression {的类型{1}}。增强的.iterator()
语句相当于表单的基本for
语句:for
其中
for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt Type Identifier = #i.next(); Statement }
是编译器生成的标识符,它与发生增强#i
语句时的范围(第6.3节)中的任何其他标识符(编译器生成的或其他标识符)不同
答案 1 :(得分:2)
Java中的for-each循环使用底层迭代器机制。所以要回答你的问题,代码是完全相同的。
这很可能不是您代码中的瓶颈。您应该使用JProfiler识别前10个方法热点,并找出如何优化这些方法调用。
答案 2 :(得分:0)
for-each语句使用迭代器迭代您的集合。编译器用while循环替换你的for-each。