Iterator.hasNext和for-each循环之间是否存在任何关系

时间:2012-02-20 05:57:25

标签: java list foreach iterator jprofiler

我使用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));
}

3 个答案:

答案 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。