Цикл 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)
Таким образом, это разница между двумя, однако, количество конверсий в обоих подходах одинаковы.