3

我用JProfiler它来分析我的应用程序,因为它是一个巨大的应用程序,所以我非常了解它的性能和效率。
这花费了太长时间,所以我将所有替换Iterator.hasNext为,for-each但是当我在 JProfilers CPU 视图中看到时,它向我显示了Iterator.hasNext名为 where I am using的方法for-each
为什么会这样?这两者之间有什么关系吗?这是示例代码:

    List<Map<String, Object>> mapList = jdbcTemplate
                        .queryForList(MAP.SELECT_ALL);
                for (Map<String, Object> map : mapList) {
            list.add(fillPreferenceMaster(preferenceMasterMap));
}
4

3 回答 3

10

是的,增强的for语句使用Iterator了可迭代集合的底层,请参阅JLS 的第 14.14.2 节

如果Expression的类型是 的子类型Iterable,则令I为表达式Expression.iterator()的类型。增强for语句等价于for以下形式的基本语句:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
        VariableModifiersopt Type Identifier = #i.next();
   Statement
}

where是一个编译器生成的标识符,它与增强语句发生时#i范围内(第 6.3 节)内的任何其他标识符(编译器生成的或其他标识符)不同。for

于 2012-02-20T06:00:29.643 回答
2

Java 中的 for-each 循环使用底层的迭代器机制。因此,要回答您的问题,代码是相同的。

这很可能不是您代码中的瓶颈。您应该使用 JProfiler 确定前 10 个方法热点,并了解如何优化这些方法调用。

于 2012-02-20T06:03:32.827 回答
0

for-each 语句使用迭代器来迭代您的集合。编译器用一个while循环替换你的for-each。

于 2012-02-20T06:01:21.093 回答