Как примитивный массив работает с новым для каждого цикла в Java? - программирование
Подтвердить что ты не робот

Как примитивный массив работает с новым для каждого цикла в Java?

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

Может ли кто-нибудь помочь мне понять это? Спасибо заранее.

int[] number = new int[10];

for(int i: number) {

}
4b9b3361

Ответ 1

Цикл эквивалентен:

for(int j = 0; j < number.length; j++) {
  int i = number[j];
  ...
}

где j - внутренне сгенерированная ссылка, которая не конфликтует с обычными идентификаторами пользователя.

Ответ 2

Немного поздно, но вот оно.

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

Если используется для сбора, компилятор переводит цикл for-each в эквивалент для цикла с помощью Iterator.

Если используется для массива, компилятор переводит цикл for-each в эквивалент для цикла с использованием индексной переменной.

Вот описание на oracle.com

Ответ 3

В вашем коде вы выделяете массив из 10 целых чисел в памяти и получаете ссылку на него. В цикле for вы просто перебираете каждый элемент в массиве, который изначально будет равен 0 для всех элементов. Значение каждого элемента будет храниться в переменной i, объявленной в вашем for-loop, когда вы повторяете элементы массива.

Ответ 4

это эквивалентно:

for(int x = 0; x < number.length; x++) {
  int i = number[x];
}

Ответ 5

Для каждого из массивов по существу это "сахар" над этой конструкцией:

for(int i = 0;i<number.length;i++)
{  
}

Я бы предположил, что это было предоставлено в виде конструкции языка, чтобы люди могли использовать расширенный цикл для структуры, которая была переименована по-старому.

Ответ 6

Это эквивалентно:

final int len = number.length;
for(int j = 0; j < len; j++) {
  int i = number[j];
}

Обратите внимание, что forEach не будет оценивать длину в каждом цикле. Это может быть также устранено JVM, но особенно в случае коллекций, где некоторые из них будут использовать

for(int j = 0; j < collection.size(); j++) {

он делает (небольшую) разницу с более быстрым

int len = collection.size()
for(int j = 0; j < len; j++) {

Ответ 7

IntStream.range(1,4) можно использовать, используя java 8.