LINUX.ORG.RU

История изменений

Исправление SaBo, (текущая версия) :

В общем, итог, по-моему следующий:

Производительность for (iterator) vs forEach зависит от фактической реализации forEach и итератора.

Для реализации java.util.ArrayList forEach выигрывает в производительности у for. Если для java.util.ArrayList заменить forEach дефолтной реализацией из java.lang.Iterable:

public static class TestList<E> extends ArrayList<E> {
    private static final long serialVersionUID = 4967704191406430634L;

    public void forEach(Consumer<? super E> action) {
      Objects.requireNonNull(action);
      for (E t : this) {
        action.accept(t);
      }
    }
  }

То вопроса о том что быстрее быть не может (т.к. используется for / iterator). Результаты теста:

Test 1 (for):     94
Test 2 (forEach): 102
Test 3 (iterator): 95
Test 4 (for):     95
Test 5 (forEach): 102
Test 6 (iterator): 102
Test 7 (for-i):   100

Исходная версия SaBo, :

В общем, итог, по-моему следующий:

Производительность for (iterator) vs forEach зависит от фактической реализации forEach.

Для реализации java.util.ArrayList forEach выигрывает в производительности у for. Если для java.util.ArrayList заменить forEach дефолтной реализацией из java.lang.Iterable:

public static class TestList<E> extends ArrayList<E> {
    private static final long serialVersionUID = 4967704191406430634L;

    public void forEach(Consumer<? super E> action) {
      Objects.requireNonNull(action);
      for (E t : this) {
        action.accept(t);
      }
    }
  }

То вопроса о том что быстрее быть не может (т.к. используется for / iterator). Результаты теста:

Test 1 (for):     94
Test 2 (forEach): 102
Test 3 (iterator): 95
Test 4 (for):     95
Test 5 (forEach): 102
Test 6 (iterator): 102
Test 7 (for-i):   100