Есть ли связь между Iterator.hasNext и циклом for-each - PullRequest
3 голосов
/ 20 февраля 2012

Я использовал JProfiler для профилирования своего приложения, так как это огромное приложение, поэтому я очень осведомлен о его производительности и эффективности.
Это заняло слишком много времени, поэтому я заменил все Iterator.hasNext на for-each, но когда я вижу в представлении CPU JProfilers, он показывает мне метод 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 ]

10 голосов
/ 20 февраля 2012

Да, расширенный оператор for использует Iterator скрытые обложки для повторяющихся коллекций, см. Раздел 14.14.2 JLS :

Еслитип Выражение является подтипом Iterable, тогда пусть I будет типом выражения Выражение .iterator().Расширенный оператор for эквивалентен базовому оператору for в форме:

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

Где #i - это идентификатор, сгенерированный компилятором, который отличается от любых других идентификаторов (генерируемых компилятором илив противном случае), которые находятся в области видимости (§6.3) в точке, где происходит расширенный оператор for.

2 голосов
/ 20 февраля 2012

Цикл for-each в Java использует базовый механизм итератора.Поэтому, чтобы ответить на ваш вопрос, код идентичен.

Скорее всего, это не узкое место в вашем коде.Вы должны определить топ-10 горячих точек метода с помощью JProfiler и выяснить, как оптимизировать эти вызовы методов.

0 голосов
/ 20 февраля 2012

Оператор for-each использует итератор для итерации по вашей коллекции.Компилятор заменяет ваш for-each на цикл while.

...