2015-03-06 3 views
1

В настоящее время я читаю книгу «Java дженерик и Коллекцию», и я нашел интересный код:Еогеаспа по примитивному или коробочному классу в Java

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

Здесь итерацию цикла Еогеаспа над примитивами:

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

Однако, Eclipse IDE предлагает мне перебрать коробочного типа:

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

есть ли какие-Бене подходит ли тот или иной стиль итерации?

+0

коллекция не поддерживает примитивные типы, поэтому существует класс обертки для использования примитивов в коллекциях. – Prashant

+0

генераторы удаляются во время выполнения, поэтому ваш список заполняется объектами. При извлечении они возвращаются к 'Integer'.Когда вы перебираете список со значениями 'int', вы принудительно делаете unboxing для каждой итерации. – Dragan

ответ

5

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

  • если вы собираетесь распаковывать в Integer раз в теле вашего цикла, как вы делаете, это не будет делать большой разницы.
  • если вы распаковывать в Integer много раз в теле вашего цикла, то было бы лучше распаковка его один раз с for(int i : ints)
  • , если вы собираетесь использовать Integer в теле вашего цикла, то с помощью 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; 
} 
+1

, и если yo использует 'int' вместо' Integer', то это также вызовет более быстрое выполнение, если коллекция имеет огромный размер. – Prashant

+0

Ваш ответ полезен, однако что, если в цикле есть много мест, где «Целое число i» будет распаковано (например, сумма вычисляется вместе с другими арифметическими операциями)? Не лучше ли использовать for (int n: ints)? –

+0

@DmytroPlekhotkin В этом случае лучше распаковать один раз с 'for (int i: ints)' конечно. – assylias

1

Да.

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) 

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

 Смежные вопросы

  • Нет связанных вопросов^_^