Поиск по сайту:

Как использовать циклы в 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:

    1. int x = 3;
    2. while (x > 0) {
    3. System.out.println("x is " + x--);
    4. }

    В первой строке вы определяете переменную 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, будет напечатан следующий вывод:

    Output
    x ==> 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:

    1. int x = 3;
    2. do {
    3. System.out.println("x is " + x--);
    4. } while (x < 0);

    Код имеет некоторое сходство с циклом while из предыдущего раздела. Во-первых, это присвоение переменной x, которая снова равна 3.

    В строке 2 цикл начинается с ключевого слова do и открывающей скобки { для блока кода. В строке 3 значение x выводится с помощью метода println(). С помощью метода println() вы также уменьшаете значение x с помощью оператора постдекремента --.

    В последней строке находится закрывающая скобка } для блока кода, за которой следует ключевое слово while с условным оператором (x < 0). Это та часть, которая отличается от предыдущего цикла while. Здесь условие обратное: x должен быть меньше, чем 0. В предыдущем примере условие требовало, чтобы x был больше, чем 0. Это изменение показывает, что блок кода будет запущен один раз, даже если условие никогда не будет выполнено.

    Когда вы запустите этот код в jshell, будет напечатан следующий вывод:

    Output
    x ==> 3 x is 3

    Первая строка подтверждает, что значение x равно 3. Во второй строке выводится x равно 3. Это особенность цикла do-while: даже если условие (x < 0) не выполняется, блок кода все равно выполняется хотя бы один раз. Это безусловное выполнение не всегда может быть желательным, поэтому вам нужно быть осторожным при использовании циклов do-while. Из-за этой оговорки циклы do-while используются не так часто.

    для циклов

    Альтернативной структурой цикла является цикл for. Он также используется для повторного запуска блока кода при выполнении условия, но имеет больше параметров, чем цикл while. В условии управления циклом вы можете добавить временную переменную, определить условие управления и изменить значение временной переменной. Таким образом, вы связываете воедино все факторы, контролирующие петлю, что снижает вероятность того, что вы что-то упустите или сделаете ошибку. Это позволяет сохранить ваш код чистым и понятным. Цикл for больше подходит, когда вы хотите написать свой код, придерживаясь более строгого стиля.

    Вот типичный цикл for:

    1. for (int x = 3; x > 0; x--) {
    2. System.out.println("x is " + x);
    3. }

    Цикл начинается с ключевого слова 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, печатается следующий вывод:

    Output
    x 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:

    1. int[] numbers = {0, 1, 2};
    2. for (int x: numbers) {
    3. System.out.println(x);
    4. }

    В первой строке вы создаете массив int, содержащий три целых числа (0, 1 и 2).

    Цикл foreach начинается со строки 2 с ключевого слова for. Затем вы определяете временную переменную int x, за которой следует двоеточие. Двоеточие используется как ярлык для операции foreach. (Операция цикла foreach уникальна, поскольку это единственное место в Java, где используется двоеточие.) После двоеточия идет набор значений, например массив.

    После оператора цикла foreach следует блок кода, который будет выполняться для каждого значения массива numbers. В этом случае оператор System.out.println(x); напечатает значение x с помощью метода println(), который будет ссылаться на каждое значение массива numbers.

    Когда вы запускаете приведенный выше код в jshell, печатается следующий вывод:

    Output
    numbers ==> int[3] { 0, 1, 2 } 0 1 2

    Первая строка подтверждает, что был определен массив с именем numbers, который содержит значения 0, 1 и 2. Следующие строки выводят значения массива, каждое на новой строке: 0, 1 и 2.

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

    Бесконечные циклы

    Бесконечные циклы — это циклы for или while, которые никогда не заканчиваются. Они становятся бесконечными, когда условие управления всегда истинно.

    Вот типичный пример бесконечного цикла while:

    1. while (true) {
    2. System.out.println("This will print forever.");
    3. }

    Первая строка выглядит как обычный цикл while, но вместо такого условия, как x > 0, есть просто значение true. В этом случае, когда необходимо оценить условие управления, true всегда возвращается напрямую. В этом случае выхода из цикла нет, поэтому он будет продолжаться вечно. Вторая строка содержит оператор System.out.println(Это будет печатать вечно.);; он напечатает текст Это будет печатать навсегда. с помощью метода println().

    Когда вы запускаете приведенный выше код в jshell, следующий вывод будет выводиться до тех пор, пока вы не завершите выполнение кода. Будьте готовы быстро завершить его комбинацией клавиш CTRL+C или просто закрыть терминал. В противном случае это будет продолжаться бесконечно:

    Output
    This will print forever. This will print forever. ...

    Отображаются только первые два повторения, но этот вывод будет продолжаться до тех пор, пока вы не нажмете CTRL+C, чтобы завершить его вручную.

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

    К сожалению, иногда бесконечные циклы создаются непреднамеренно. Вы можете совершить ошибку и вызвать бесконечный цикл. Рассмотрим следующий код:

    1. int x = 3;
    2. while (x > 0) {
    3. System.out.println("x is " + x);
    4. }

    Приведенный выше код похож на самый первый пример в этом руководстве. В первой строке вы определяете переменную x со значением 3.

    В строке 2 находится ключевое слово while и условие управления, в котором говорится, что цикл должен продолжаться, пока x > 0 истинно.

    Оператор System.out.println(x is + x); в строке 3 выводит значение x с помощью println(). метод. Однако, в отличие от примера с циклом while в первом разделе этого руководства, где цикл завершился после трех запусков, в текущем примере нет операции постдекремента для x. . Из-за этого, когда вы запускаете этот цикл в jshell, вы получите следующий непрерывный вывод:

    Output
    x is 3 x is 3 ...

    Эти строки будут повторяться бесконечно, пока вы не завершите цикл нажатием CTRL+C. Такие непреднамеренные бесконечные циклы опасны, потому что они могут привести к сбою программы или перегрузке машины, на которой выполняется программа. Вот почему вы должны быть осторожны при создании циклов и убедиться, что существует жизнеспособный путь завершения. В текущем примере вы должны убедиться, что x уменьшается с каждым циклом, чтобы выполнить условие выхода из цикла x > 0.

    Заключение

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

    Чтобы узнать больше о Java, ознакомьтесь с нашей серией статей How To Code in Java.