Как использовать циклы в Java
Автор выбрал программу Write for DOnations.
Введение
Написание повторяющихся задач распространено в программировании. Один из вариантов — написать один и тот же или похожий код столько раз, сколько необходимо для многократного выполнения блока кода. Этот подход далек от совершенства, потому что он создает много повторяющегося кода, который трудно читать и поддерживать. Лучше использовать циклы.
Циклы — это структуры для управления повторяющимся потоком программы. Типичный цикл состоит из двух частей. Одна часть представляет собой логическое условие управления. Другая часть представляет собой блок кода, который будет выполняться, пока условие истинно или пока условие не станет ложным. Логическое условие переоценивается при каждом запуске блока кода. Критерии выхода из цикла различны для каждого типа цикла, как вы узнаете из этого руководства.
Существует два основных типа циклов: циклы while
и for
. Какой это тип зависит от синтаксиса и логики цикла. Циклы while
зависят от логического условия. Это условие может быть общим, и пока оно верно, кодовый блок выполняется повторно. Циклы for
также многократно выполняют блок кода, но условие цикла обычно зависит от увеличения или уменьшения целочисленной переменной. Когда эта переменная достигает определенного целевого значения, цикл прерывается.
В этом руководстве вы будете использовать циклы while
и for
для создания повторяющихся задач и узнаете о преимуществах и недостатках каждой из них.
Предпосылки
Чтобы следовать этому руководству, вам понадобятся:
- Среда, в которой вы можете выполнять программы Java, чтобы следовать примерам. Чтобы настроить это на вашем локальном компьютере, вам потребуется следующее:
- На вашем компьютере установлена Java (версия 11 или выше) с компилятором, входящим в комплект Java Development Kit (JDK). Для Ubuntu и Debian следуйте инструкциям по загрузке для установки Java.
- Для компиляции и запуска примеров кода в этом руководстве используется руководство Introduction to JShell.
Знакомство с Java и объектно-ориентированным программированием, которое вы можете найти в нашем руководстве «Как написать свою первую программу на Java».
Понимание типов данных Java, которое обсуждается в нашем руководстве Понимание типов данных в Java.
в то время как циклы
Циклы
while
отслеживают общий логический условный оператор. Например, условный оператор может проверить, равны ли две целочисленные переменные, или два объекта одинаковы, связаны, неnull
, или что-то еще, что можно проверить программно. Действительно, можно использовать любое логическое выражение, поэтому циклыwhile
настолько эффективны и широко используются.В этом разделе вы создадите свой первый программный цикл на Java, используя ключевое слово
while
. Вы будете использовать одну операцию постдекремента, которая завершит текущий цикл после некоторых выполнений. Без него цикл будет продолжаться бесконечно.Информация: Чтобы следовать примеру кода в этом руководстве, откройте инструмент JShell в вашей локальной системе, выполнив команду
jshell
. Затем вы можете копировать, вставлять или редактировать примеры, добавляя их после приглашенияjshell>
и нажимаяENTER
. Чтобы выйти изjshell
, введите/exit
.Чтобы проверить этот код, вставьте следующие строки в
jshell
:- int x = 3;
- while (x > 0) {
- System.out.println("x is " + x--);
- }
В первой строке вы определяете переменную
x
.Цикл начинается со строки 2 с ключевого слова
while
. Условный оператор(x > 0)
управляет циклом. Он сравнивает, больше лиx
, чем0
. После этого следует открывающая скобка{
, обозначающая начало блока кода. Этот блок кода будет выполняться повторно, пока условие истинно (x > 0
).Внутри блока кода оператор
System.out.println(x is + x--);
в строке 3 печатает текущее значениеx
, используяprintln()
метод. (Чтобы узнать больше об оператореSystem.out.println
, ознакомьтесь с нашим руководством Как написать свою первую программу на Java.) Внутри аргумента дляprintln()
,x
постдекрементируется на1
с кодомx--
. При каждом выполненииx
уменьшается на1
.Блок кода заканчивается в последней строке закрывающей скобкой
}
. Это также конец цикла.Когда вы запустите этот код в
jshell
, будет напечатан следующий вывод:Outputx ==> 3 x is 3 x is 2 x is 1Первая строка подтверждает, что
x
получил значение3
. В следующих строках значениеx
печатается три раза, каждый раз уменьшаясь на1
. Есть только три итерации, гдеx
равно3
,2
и1
. Цикл прерывается, когдаx
достигает0
, поскольку условный операторx > 0
больше не выполняется. В этот момент цикл завершается, и больше ничего не печатается.Предыдущий пример является распространенным способом создания цикла. Цель цикла ясна, и условие выхода простое:
x > 0
. Теоретически вы можете усложнить условие, добавив дополнительные переменные и сравнения (например,x > 0
иy < 0
), но это не считается лучшей практикой. с точки зрения чистого кода. Сложные условия делают код трудным для понимания и понимания, при этом принося небольшую пользу, если вообще какую-либо.Циклы do-while
Цикл
do-while
менее популярен, чем циклыwhile
, но по-прежнему широко используется. Циклdo-while
похож на циклwhile
, но они отличаются одним ключевым аспектом: сначала выполняется блок кода, а затем оценивается условие цикла.Напоминаем, что циклы
while
сначала оценивают условие и могут никогда не запустить блок кода, если условие не выполняется. Однако в циклахdo-while
всегда выполняется хотя бы одно выполнение блока кода, прежде чем оценивается условие управления циклом. Если условие истинно, цикл будет продолжать дополнительные итерации, пока оно не перестанет быть истинным. Из-за этого циклыdo-while
полезны в таких случаях, как задание вопроса и завершение цикла только при правильном ответе.В этом разделе вы создадите цикл
do-while
, аналогичный циклуwhile
в предыдущем разделе. Переменнаяint
будет называтьсяx
и будет иметь начальное значение3
. Однако на этот раз условие меняется на противоположное (x < 0
), и блок кода будет выполняться до того, как условие будет оценено.Откройте
jshell
и добавьте циклdo-while
:- int x = 3;
- do {
- System.out.println("x is " + x--);
- } while (x < 0);
Код имеет некоторое сходство с циклом
while
из предыдущего раздела. Во-первых, это присвоение переменнойx
, которая снова равна3
.В строке 2 цикл начинается с ключевого слова
do
и открывающей скобки{
для блока кода. В строке 3 значениеx
выводится с помощью методаprintln()
. С помощью методаprintln()
вы также уменьшаете значениеx
с помощью оператора постдекремента--
.В последней строке находится закрывающая скобка
}
для блока кода, за которой следует ключевое словоwhile
с условным оператором(x < 0)
. Это та часть, которая отличается от предыдущего циклаwhile
. Здесь условие обратное:x
должен быть меньше, чем0
. В предыдущем примере условие требовало, чтобыx
был больше, чем0
. Это изменение показывает, что блок кода будет запущен один раз, даже если условие никогда не будет выполнено.Когда вы запустите этот код в
jshell
, будет напечатан следующий вывод:Outputx ==> 3 x is 3Первая строка подтверждает, что значение
x
равно3
. Во второй строке выводитсяx равно 3
. Это особенность циклаdo-while
: даже если условие (x < 0
) не выполняется, блок кода все равно выполняется хотя бы один раз. Это безусловное выполнение не всегда может быть желательным, поэтому вам нужно быть осторожным при использовании цикловdo-while
. Из-за этой оговорки циклыdo-while
используются не так часто.для циклов
Альтернативной структурой цикла является цикл
for
. Он также используется для повторного запуска блока кода при выполнении условия, но имеет больше параметров, чем циклwhile
. В условии управления циклом вы можете добавить временную переменную, определить условие управления и изменить значение временной переменной. Таким образом, вы связываете воедино все факторы, контролирующие петлю, что снижает вероятность того, что вы что-то упустите или сделаете ошибку. Это позволяет сохранить ваш код чистым и понятным. Циклfor
больше подходит, когда вы хотите написать свой код, придерживаясь более строгого стиля.Вот типичный цикл
for
:- for (int x = 3; x > 0; x--) {
- System.out.println("x is " + x);
- }
Цикл начинается с ключевого слова
for
в первой строке. Условный оператор в скобках состоит из трех частей:int x=3
определяет переменную (x
). Определение временной переменной здесь удобно, потому что они нужны только для цикла, поэтому имеет смысл интегрировать их в цикл. Напротив, когда вы использовали циклwhile
, вам приходилось объявлять переменную отдельно перед циклом.x > 0
— это условие, которое должно быть выполнено для выполнения блока кода. В этом случаеx
должен быть больше, чем0
. Эта часть аналогична оператору управления цикломwhile
, который содержит только оцениваемое условие.x--
— это действие, выполняемое во время каждой успешной итерации. В этом случае операция постдекремента уменьшает значениеx
после каждого успешного выполнения.
Оператор
System.out.println(x is + x);
в строке 2 выводит значениеx
с помощьюprintln()
. метод. Он получает значениеx
без изменений. Напротив, вы использовали методprintln()
для управления значениемx
в циклеwhile
. В этом нет необходимости, поскольку операция постдекремента уже реализована в третьей части условного оператора:x--
.Строка 3 завершает блок кода и всю структуру цикла закрывающей скобкой
}
.Когда вы запускаете этот код в
jshell
, печатается следующий вывод:Outputx is 3 x is 2 x is 1Вывод подтверждает, что блок кода был выполнен три раза. В первый раз значение
x
равно3
. Во второй разx
равно2
, а в третий разx
равно1
. После третьего разаx
становится0
, и цикл завершается без выполнения блока кода (который печатает значениеx
).Этот цикл
for
дает тот же результат, что и циклwhile
. С точки зрения производительности и использования ресурсов не должно быть никакой разницы, поэтому в основном это вопрос личных предпочтений, какой цикл использовать. Однако, если количество итераций известно, обычно предпочтительнее использовать циклfor
, поскольку он позволяет вам более внимательно следить за кодом.циклы foreach
Цикл
foreach
подобен другим циклам, но его преимущество в том, что он специально разработан для перебора группы значений с минимальным количеством кода. Пока у вас есть группа значений, вы можете просматривать их без необходимости отслеживать их количество или следить за ходом итерации. Циклforeach
гарантирует, что если в группе есть значения, они будут извлечены одно за другим и представлены вам.Большинство языков программирования имеют удобный ярлык для цикла
foreach
. В Java нет отдельного ключевого словаforeach
, вместо него используется ключевое словоfor
. Однако условный операторforeach
отличается от обычного циклаfor
, как вы обнаружите далее.Для работы с циклами
foreach
приходится использовать группу значений, и для этой цели подходит массив. Массив — это объект, содержащий значения одного типа. В следующем примере вы будете использовать массив, содержащий значенияint
.Добавьте следующий код для цикла
foreach
вjshell
:- int[] numbers = {0, 1, 2};
- for (int x: numbers) {
- System.out.println(x);
- }
В первой строке вы создаете массив
int
, содержащий три целых числа (0
,1
и2
).Цикл
foreach
начинается со строки 2 с ключевого словаfor
. Затем вы определяете временную переменнуюint x
, за которой следует двоеточие. Двоеточие используется как ярлык для операцииforeach
. (Операция циклаforeach
уникальна, поскольку это единственное место в Java, где используется двоеточие.) После двоеточия идет набор значений, например массив.После оператора цикла
foreach
следует блок кода, который будет выполняться для каждого значения массиваnumbers
. В этом случае операторSystem.out.println(x);
напечатает значениеx
с помощью методаprintln()
, который будет ссылаться на каждое значение массиваnumbers
.Когда вы запускаете приведенный выше код в
jshell
, печатается следующий вывод:Outputnumbers ==> int[3] { 0, 1, 2 } 0 1 2Первая строка подтверждает, что был определен массив с именем
numbers
, который содержит значения0
,1
и2
. Следующие строки выводят значения массива, каждое на новой строке:0
,1
и2
.В то время как использование других циклов в основном зависит от личного выбора, цикл
foreach
является стандартом де-факто для перебора группы значений. Можно создать собственную альтернативу циклуforeach
, используя циклfor
илиwhile
, но это не стоит усилий и требует глубокое понимание структур данных.Бесконечные циклы
Бесконечные циклы — это циклы
for
илиwhile
, которые никогда не заканчиваются. Они становятся бесконечными, когда условие управления всегда истинно.Вот типичный пример бесконечного цикла
while
:- while (true) {
- System.out.println("This will print forever.");
- }
Первая строка выглядит как обычный цикл
while
, но вместо такого условия, какx > 0
, есть просто значениеtrue
. В этом случае, когда необходимо оценить условие управления,true
всегда возвращается напрямую. В этом случае выхода из цикла нет, поэтому он будет продолжаться вечно. Вторая строка содержит операторSystem.out.println(Это будет печатать вечно.);
; он напечатает текстЭто будет печатать навсегда.
с помощью методаprintln()
.Когда вы запускаете приведенный выше код в
jshell
, следующий вывод будет выводиться до тех пор, пока вы не завершите выполнение кода. Будьте готовы быстро завершить его комбинацией клавишCTRL+C
или просто закрыть терминал. В противном случае это будет продолжаться бесконечно:OutputThis will print forever. This will print forever. ...Отображаются только первые два повторения, но этот вывод будет продолжаться до тех пор, пока вы не нажмете
CTRL+C
, чтобы завершить его вручную.В примере с бесконечным циклом имеется явное намерение создать такой цикл из-за единственного значения
true
, размещенного вместо логического оператора. Такие циклы были популярны в прошлом и могут присутствовать в старых проектах. Вы по-прежнему можете создавать такие бесконечные циклы, но есть лучшие способы создания постоянно выполняющихся задач, например, с помощью задач таймера. ЗадачиТаймер
предпочтительнее, поскольку они более сложны и предлагают больше возможностей.К сожалению, иногда бесконечные циклы создаются непреднамеренно. Вы можете совершить ошибку и вызвать бесконечный цикл. Рассмотрим следующий код:
- int x = 3;
- while (x > 0) {
- System.out.println("x is " + x);
- }
Приведенный выше код похож на самый первый пример в этом руководстве. В первой строке вы определяете переменную
x
со значением3
.В строке 2 находится ключевое слово
while
и условие управления, в котором говорится, что цикл должен продолжаться, покаx > 0
истинно.Оператор
System.out.println(x is + x);
в строке 3 выводит значениеx
с помощьюprintln()
. метод. Однако, в отличие от примера с цикломwhile
в первом разделе этого руководства, где цикл завершился после трех запусков, в текущем примере нет операции постдекремента дляx
. . Из-за этого, когда вы запускаете этот цикл вjshell
, вы получите следующий непрерывный вывод:Outputx is 3 x is 3 ...Эти строки будут повторяться бесконечно, пока вы не завершите цикл нажатием
CTRL+C
. Такие непреднамеренные бесконечные циклы опасны, потому что они могут привести к сбою программы или перегрузке машины, на которой выполняется программа. Вот почему вы должны быть осторожны при создании циклов и убедиться, что существует жизнеспособный путь завершения. В текущем примере вы должны убедиться, чтоx
уменьшается с каждым циклом, чтобы выполнить условие выхода из циклаx > 0
.Заключение
В этом руководстве вы использовали структуры циклов для создания повторяющихся задач. Вы узнали, когда целесообразно использовать циклы
while
иfor
, и написали с ними несколько примеров кода. Вы также узнали о передовых методах чистого кода и о том, как избежать распространенных ошибок, связанных с циклами.Чтобы узнать больше о Java, ознакомьтесь с нашей серией статей How To Code in Java.