【问题标题】:Is there any Relation between Iterator.hasNext and for-each loopIterator.hasNext 和 for-each 循环之间是否有任何关系
【发布时间】:2012-03-10 12:53:57
【问题描述】:

我使用JProfiler 来分析我的应用程序,因为它是一个巨大的应用程序,所以我非常了解它的性能和效率。
这花费了太长时间,所以我用for-each 替换了所有Iterator.hasNext,但是当我在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));
}

【问题讨论】:

标签: java list foreach iterator jprofiler


【解决方案1】:

Java 中的 for-each 循环使用底层的迭代器机制。所以回答你的问题,代码是一样的。

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

【讨论】:

  • 我正在这样做,但大部分时间都是由 jsp 方法占用的,它们以非常奇怪的方式可见。不知道是哪个标签占用了太多时间......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    是的,增强的for 语句使用Iterator 隐藏在可迭代集合中,请参阅Section 14.14.2 of the JLS:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2013-08-07
      • 2010-12-19
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      相关资源
      最近更新 更多