Цикл foreach примитивом или упакованным классом в Java

В настоящее время я читаю книгу "Обобщения и коллекции Java" и обнаружил интересный код:

List<Integer> ints = Arrays.asList(1,2,3);
int s = 0;
for (int n : ints) { s += n; }
assert s == 6;

Здесь цикл foreach перебирает примитивы:

for (int n : ints) { ... }

Тем не менее, Eclipse IDE предлагает мне выполнить итерации в штучной упаковке:

for (Integer n : ints) { ... }

Есть ли преимущества использования того или иного стиля итерации?

2 ответа

Решение

Бокс / распаковка имеет стоимость во время выполнения.

  • если вы собираетесь распаковать Integer Однажды в теле вашей петли, как вы делаете, это не будет иметь большого значения.
  • если вы распакуете Integer много раз в теле вашего цикла, вам лучше было бы распаковать его один раз с for(int i : ints)
  • если вы собираетесь использовать целое число в теле вашего цикла, то с помощью int приведет к ненужной операции unbox/box.

Например:

List<Integer> subList = new ArrayList<>();

for (Integer i : ints) { //better not to unbox
  if (someCondition(i)) subList.add(i);
}

for (int i : ints) { //better to unbox once
  int a = i;
  int b = 2 * i;
  sum += a + b - i;
}

Да.

    List<Integer> ints = Arrays.asList(1,2,3); //here lists is of type Integer which is boxed type
    int s = 0; //s is primitive type

Помните, что мы можем сравнивать только:

1.) примитив к примитивному типу

2.) в штучной упаковке

мы можем сказать

Список Ints может быть представлен как:

    [Integer.valueof(1), Integer.valueof(2), Integer.valueof(3)]

Итак, в следующем коде

    for (int n : ints) // in every loop ints current index value which is an Integer is unboxed and assigned to 'int n'

и когда следующий код читается..

     s += n;// int n is added to int s (primitive added to primitive ie; no conversion done here)

2.) Теперь второй подход

    for (Integer n : ints) { ... }// here, since 'n' is also boxed so no conversion takes place

Однако, когда встречается следующая строка

    s += n; // boxed Integer n is unboxed to a primitive and added to primitive 's' (so unboxing/conversion happens in each addition)

Таким образом, это разница между двумя, однако, количество конверсий в обоих подходах одинаковы.

Другие вопросы по тегам