作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
编写重复的任务在编程中很常见,一个选项是编写相同或类似的代码,需要多少次,以便一个代码块重复执行,这种方法远非完美,因为它会产生大量重复的代码,难以阅读和维护。
循环是用于控制重复的程序流程的结构. 一个典型的循环有两个部分. 一部分是布尔控制状态. 另一部分是代码块,将执行,而条件是真的或直到条件是假的。
有两种主要类型的循环:而
和为
循环。它是哪种类型的,取决于循环的语法和逻辑。而
循环取决于布尔条件。这种条件可能是一般的,虽然它是真的,但代码块被重复执行。为
循环也重复执行代码块,但循环条件通常取决于整数变量的增加或下降。当这种变量达到一定的目标值时,循环就会破裂。
在本教程中,您将使用在
和为
循环来创建重复性的任务,并了解每个任务的优点和缺点。
前提条件
要遵循本教程,您将需要:
- 联合国 一个您可以执行 Java 程序的环境, 与示例一起执行 。 要在您的本地机上设置此功能, 您需要以下操作:
- Java( 第11版或以上)安装在您的机上, 由 Java 开发 Kit( JDK) 提供编译器. 对于Ubuntu和Debian,请在我们教程中遵循备选1的步骤如何在Ubuntu 22.04上安装Java. 对于其他操作系统,包括Mac和Windows,遵循Java安装的下载选项.
- 要编译和运行代码示例,此教程使用Java Shell,又名JShell,是从命令行运行的 [Read-Evaluate-Print Loop (REPL)] (https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop). 要从JShell开始,请查看[JShell介绍 (https://docs.oracle.com/javase/10/jshell/introduction-jshell.htm#JSHEL-GUID-630F27C8-1195-4989-9F6B-2C51D46F52C8)指南.
- 熟悉 Java 和面向对象的编程, 您可以在我们的教程中找到[ How to Write your First Program in Java] (https://andsky.com/tech/tutorials/how-to-write-your-first-program-in-java).
- 对Java数据类型的理解,我们教程中了解Java中的数据类型对此进行了讨论. (英语)
《When》 Loops
例如,条件声明可以验证两个整数变量是否等同,或者两个对象是否相同,相关,而不是零
,或者其他任何可以编程检查的内容。
在本节中,你将使用while
的关键字在Java中创建你的第一个编程循环。你将使用一个单一的(https://andsky.com/tech/tutorials/understanding-data-types-in-java#primitive-types)变量来控制循环。int
变量将被称为x
并具有3
的初始值。虽然或只要x
大于0
,循环将继续执行一个代码块。在这个代码块中,x
的值将被打印,最重要的是,在每次执行时会被后降级(使用--
操作员)。
<$>[info]
Info: 要跟随本教程中的示例代码,请在本地系统上运行jshell
命令来打开JShell工具,然后您可以通过在jshell
提示后添加它们来复制、粘贴或编辑示例,然后按ENTER
。
要测试此代码,请将下列行插入jshell
:
1int x = 3;
2while (x > 0) {
3 System.out.println("x is " + x--);
4}
在第一行中,您定义了x
变量。
循环从第 2 行开始,关键字是而
(x > 0) 控制循环,它比较x
是否大于0
然后出现开关{
,标志着 代码块的开始。
在代码块内,System.out.println
(x是
+ x--);3行
的陈述使用println()
方法打印了x
的当前值。 (有关System.out.println
陈述的更多信息,请参阅我们的教程How To Write Your First Program in Java
(LINK0
))。
代码区块在最后一行结束时用关闭轴 }
. 这也是循环的结尾。
当您在jshell
中运行此代码时,下列输出将打印:
1[secondary_label Output]
2x ==> 3
3x is 3
4x is 2
5x is 1
第一行确认x
已收到3
的值。下列行上,x
的值被打印三次,每次减少为1
。只有三个迭代,其中x
等于3
,2
和1
。当x
达到0
时,循环会断开,因为条件陈述x > 0
不再满足。
上面的例子是创建循环的一种常见方法。循环的意图是明确的,输出条件是简单的:x > 0
在理论上,你可以通过添加额外的变量和比较(如x > 0
和y < 0
)来使条件更加复杂,但从清洁代码(https://www.oreilly.com/library/view/clean-code-a/9780136083238/)的角度来看,这并不是最好的做法。
當時的「」
Do-while
循环比while
循环不那么受欢迎,但仍然被广泛使用,Do-while
循环类似于while
循环,但它们在一个关键方面有所不同:代码块首先执行,然后对循环条件进行评估。
作为提醒,‘而’循环首先评估条件,如果条件未满足,则可能永远不会运行代码块。在‘而’循环中,在循环控制条件被评估之前,总是至少有一次执行代码块。
在本节中,您将创建一个类似于上一节中的while
循环的do-while
循环,而int
变量将被称为x
并具有3
的初始值。
打开jshell
并添加Do-while
循环:
1int x = 3;
2do {
3 System.out.println("x is " + x--);
4} while (x < 0);
代码与上一节中的而
循环有一些相似之处,首先,有变量x
的分配,这又是3
。
在第 2 行中,循环以关键字 do
和代码块的开头轴 {
开始。在第 3 行中,使用 println() 方法打印了
x' 的值。
在最后一行是代码块的关闭栏 },随后是条件声明
(x < 0)的
而关键字。这是与之前的
而循环不同的一部分. 在这里,条件是逆转的:
x应该小于
0。
当您在jshell
中运行此代码时,下列输出将打印:
1[secondary_label Output]
2x ==> 3
3x is 3
第一行确认x
的值为3
。第二行打印x
为3
。这是do-while
循环的特殊性:即使条件(x < 0)未满足,代码块仍然至少执行一次,这种无条件的执行可能并不总是可取的,这就是为什么你在使用do-while
循环时需要小心。
《为了路》
另一种循环结构是for
循环,它也被用来在条件下重复运行一个代码块,但它比while
循环有更多的选项。在循环控制条件中,你可以添加临时变量,定义控制条件,并改变临时变量的值。这样,你将控制循环的所有因素结合起来,使它不太可能错过某些东西或犯错误。这使你能够保持你的代码干净和易懂。
这里有一个典型的for
循环:
1for (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是
+ x);在2行上使用
println()方法打印了
x的值,它接收了
x的值不变。相反,你用
println()方法操纵
x的值在
而`循环中。
行 3 将代码块和整个循环结构用关闭支架 }
结束。
当您在jshell
中运行此代码时,下列输出会打印:
1[secondary_label Output]
2x is 3
3x is 2
4x is 1
输出证实了代码块已被执行三次.第一次,x的值是3;第二次,x是2;第三次,x是1。
从性能和资源使用的角度来看,不应该有任何差异,所以它主要是个人偏好使用哪个循环的问题。
前方
路径
一个前进
循环与其他循环类似,但它的好处在于它专门设计用于在一组值中重复以尽可能少的代码。只要你有一组值,你可以通过它们而不必跟踪它们的数量或跟踪重复进度。
大多数编程语言都有一个方便的forach
环节的捷径,在Java中没有专用的forach
关键字,而是使用for
关键字,但是forach
条件陈述不同于常见的for
环节,如下所述。
要使用前方
循环,您必须使用一个值组,而一个 array是适用于此目的的。
将以下代码添加到jshell
中的forach
循环:
1int[] numbers = {0, 1, 2};
2for (int x: numbers) {
3 System.out.println(x);
4}
在第一行上,您创建一个包含三个整数的int
数组(0
,1
和2
).
前方
循环从线2开始,以为
关键字。然后,你定义一个临时变量int x
,然后是结肠. 结肠被用作前方
操作的捷径。 (前方循环声明是独一无二的,因为这是Java中唯一使用结肠的地方)。
在前方
循环声明之后,将为数组
的每个值执行的代码块。在这种情况下,System.out.println(x);
声明将使用println()
方法打印x
的值,该声明将参考数组
的每个值。
当您在jshell
中运行上述代码时,以下输出打印:
1[secondary_label Output]
2numbers ==> int[3] { 0, 1, 2 }
30
41
52
第一行确认已定义一个名为数字
的数组,其中包含值为0
,1
和2
。
虽然使用其他循环主要是个人选择的问题,但前进
循环是重复一组值的实际标准,可以使用为
或同时
循环创建自己的前进
循环替代方案,但不值得努力,需要对数据结构的深刻理解。
无限的路径
无限循环是为
或而
循环,当控制条件总是真实时,它们会变得无限。
以下是无限而
循环的常见例子:
1while (true) {
2 System.out.println("This will print forever.");
3}
第一行看起来像一个典型的而
循环,但而不是一个条件,如x > 0
,只有值true
。在这种情况下,当一个控制条件被评估时,true
总是直接返回。
当你在jshell
中运行上述代码时,下面的输出将打印到你终止代码为止.准备用键盘组合CTRL+C
快速终止它,或者只是关闭终端。
1[secondary_label Output]
2This will print forever.
3This will print forever.
4...
仅显示前两次重复,但此输出将继续,直到您按CTRL+C
来手动终止。
使用无限循环示例,有明确的意图创建这样的循环,因为单个真实
值被放置而不是布尔语陈述。此类循环在过去很受欢迎,并且可能存在于遗传项目中。
不幸的是,有时无限循环不是故意的,你可能会犯错误,造成无限循环。
1int x = 3;
2while (x > 0) {
3 System.out.println("x is " + x);
4}
上面的代码看起来类似于本教程中的第一个示例,在第一行中,你定义了变量x
的值3
。
在第 2 行中,出现了而
关键字和控制条件,该条件表示循环应该继续,而x > 0
是正确的。
System.out.println
(x是
+ x);在3行中使用
println()方法打印了
x的值,但是,与本教程的第1节(
LINK0)中的
while循环示例不同,循环在三次运行后结束,在当前示例中没有
x的
postdecrement操作,因此,当你在
jshell`中运行这个循环时,你会得到以下连续输出:
1[secondary_label Output]
2x is 3
3x is 3
4...
这些行会无限重复,直到你用CTRL+C
终止循环. 这种无意无限循环是危险的,因为它们可能会导致程序崩溃或过载运行该程序的机器,这就是为什么你在创建循环时应该小心,并确保有一个可行的终止路径。
结论
在本教程中,你使用循环结构来创建重复性的任务. 你学到了什么时候使用而
和为
循环是合适的,并用它们写了一些代码示例. 你还学到了清洁代码的最佳实践以及如何避免与循环相关的常见陷阱。
關於Java的更多信息,請參閱我們的 如何在Java中編碼系列。