Циклы в Java

Цикл while

Пример использования:

int x = 10;
while (x > 0) {
    System.out.println(x);
    x = x / 2;
}

В цикле каждый раз сначала проверяется условие. Если оно верно, выполняется тело цикла, если неверно, цикл завершается. В данном случае будут выведены числа 10, 5, 2, 1.

Обычно цикл while используется, когда вы не знаете заранее, сколько нужно будет раз повторить тело цикла. Если вы точно знаете, что тело цикла надо выполнить, например, 10 раз, лучше используйте цикл for, про который написано дальше.

Очень часто оказываетя, что условие неудобно проверять в начале цикла. Например, если нам нужно читать слова из файла, пока не будет прочитано слово stop`, рекомендую использовать следующую версию “бесконечного” цикла:

while (true) { // условие всегда верно
    String word = readNextWord(); //эта функция ненастоящая, она нужна для примера
    if (word.equals("stop"))
        break; //это оператор для завершения цикла
    System.out.println("Было прочитано слово " + word);
}

Кроме оператора break еще есть оператор continue, который завершает только текущую итерацию цикла и переходит срауз к проверке условия цикла. Эти два оператора можно использовать в любых циклах, не только while.

Цикл for

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

for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}

Будут выведены числа от 1 до 10.

Цикл for состоит из инициализатора, условия, инкремента, они пишутся в круглых скобках и разделяются точками с запятой. Кроме того, в цикле есть тело, котрое пишется далее в фигурных скобках. Как обычно, в этом цикле можно не ставить фигурные скобки, если тело состоит из одного оператора. (В while тоже можно не ставить). В этом примере фигурные скобки можно убрать.

При выполнении цикла сначала выполняется инициализатора. В данном случае задается переменная i и инициализируется единицей. Далее проверется условие, если оно верно, выполняется тело цикла. В данном случае в условии проверяется, что i не превысило 10. После тела цикла выполняется инкремент, в данном случае он увеличивает значение i. Далее процесс зацикливается, снова проверяется условие, выполняется тело и инкремент. Цикл закончится, когда при проверке условия оно окажется ложным.

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

Перебор от 10 до 1 включительно

for (int i = 10; i >= 1; i--) {}

Перебор от 0 до 20, но не включая 20:

for (int i = 0; i < 20; i++) {}

Перебор от 1 до 10 с шагом 2:

for (int i = 1; i <= 10; i += 2) {}

Перебор сразу двух переменных, одна увеличивается, другая уменьшается:

for (int i = 1, j = 10; i <= j; i++, j--) {
   System.out.println(i + ", " + j);
}

Будет распечатано 1, 10 2, 9 3, 8 4, 7 5, 6.

Еще один полезный пример, перебор букв:

for (char c = 'a'; c <= 'z'; c++) {}

Перебор основан на том, что Java неявно приводит типы между char и int.

Последний пример - это стандартный способ перебора элементов массива:

for (int i = 0; i < a.length; i++)
    System.out.println("элемент с индексом " + i + " равен " + a[i]);

Но если вам не нужен индекс при переборе элементов, лучше пользуйтесь циклом for each.

Цикл for each

Этот цикл является аналогом цикла for в Python. Он позволяет перебирать массивы и коллекции (списки, множества). Строки, в отличие от python, так перебирать нельзя.

String[] words = {"hello", "world"};
for (String word : words) {
    System.out.println(word);
}

В Python бы было написано:

words = ["hello", "world"]
for word in words:
    print(word)

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

Цикл for each будет использоваться в ваших программах чаще всех других видов цикла.