Ответ 1
Цикл эквивалентен:
for(int j = 0; j < number.length; j++) {
int i = number[j];
...
}
где j - внутренне сгенерированная ссылка, которая не конфликтует с обычными идентификаторами пользователя.
Я понимаю, что новый для каждого цикла работает с Iterable и массивами, но я не знаю, что происходит за кулисами при работе с массивами.
Может ли кто-нибудь помочь мне понять это? Спасибо заранее.
int[] number = new int[10];
for(int i: number) {
}
Цикл эквивалентен:
for(int j = 0; j < number.length; j++) {
int i = number[j];
...
}
где j - внутренне сгенерированная ссылка, которая не конфликтует с обычными идентификаторами пользователя.
Немного поздно, но вот оно.
Компилятор знает, используете ли вы оператор for-each для коллекции или для массива.
Если используется для сбора,
компилятор переводит цикл for-each в эквивалент для цикла с помощью Iterator
.
Если используется для массива, компилятор переводит цикл for-each в эквивалент для цикла с использованием индексной переменной.
В вашем коде вы выделяете массив из 10 целых чисел в памяти и получаете ссылку на него. В цикле for вы просто перебираете каждый элемент в массиве, который изначально будет равен 0 для всех элементов. Значение каждого элемента будет храниться в переменной i
, объявленной в вашем for-loop, когда вы повторяете элементы массива.
это эквивалентно:
for(int x = 0; x < number.length; x++) {
int i = number[x];
}
Для каждого из массивов по существу это "сахар" над этой конструкцией:
for(int i = 0;i<number.length;i++)
{
}
Я бы предположил, что это было предоставлено в виде конструкции языка, чтобы люди могли использовать расширенный цикл для структуры, которая была переименована по-старому.
Это эквивалентно:
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++) {
IntStream.range(1,4) можно использовать, используя java 8.