Java for循环
Java for循环重复一组Java操作。只要某些条件为真," for"循环就会重复执行一段代码。这是一个简单的Java for循环示例:
for(int i=0; i < 10; i++) { System.out.println("i is: " + i); }
这个例子是一个标准的Java for循环。在for关键字后的括号()内是三个用分号(;)分隔的语句。
第一条语句声明一个名为i
的int
变量,并将其赋值为'0'。当for
循环开始时,该语句仅执行一次。
第二条语句将变量" i"的值与值" 10"进行比较。如果" i"的值小于" 10",则" for"循环将再执行一次。该语句在每次for循环重复之前执行。
第三条语句增加" i"的值。在执行for循环的主体之后,对于for循环的每个迭代也执行一次该语句。
上面显示的" for"循环的结果是循环的主体执行了10次。对于小于10(0到9)的每个" i"值,都应执行一次。
实际上,我们不需要在for
循环主体周围使用花括号。如果省略花括号,则仅执行for
循环语句之后的第一个Java语句。这是一个例子:
for(int i = 0; i < 10; i++) System.out.println("i is 1: " + i); // executed inside loop. System.out.println("second line"); // executed after loop.
在这个例子中,只有第一个System.out.println()
语句在for
循环内执行。直到for
循环完成后,第二条System.out.println()
语句才会执行。
遗忘for
循环体周围的花括号是一个常见的错误。因此,仅将它们放在" for"循环体周围是一个好习惯。
循环初始化,条件和后期迭代操作
如前所述," for"循环包含三个语句,以分号分隔。这是上面的示例,显示了三个语句:
for(int i=0; i < 10; i++) { System.out.println("I is: " + i); }
这些语句在for循环的执行中各有不同的作用。这些角色是:
- 循环初始化器
- 循环条件
- 迭代后操作
我将在下面更详细地说明这些角色。
循环初始化器
在" for"循环开始之前,循环初始化程序语句仅执行一次。循环初始化程序语句通常用于初始化循环条件语句使用的变量或者对象。在上面的示例(下面重复)中,循环初始化器语句(以粗体显示)声明了一个" int"变量,并将其赋值为0。
for(int i=0; i < 10; i++) { System.out.println("i is: " + i); }
我们不需要循环初始化程序语句。它是可选的。这是一个没有循环初始化程序语句的" for"循环:
MyLoop loop = new MyLoop(10); for( ; loop.loopAgain() ; loop.iterationDone()) { }
注意如何使用对象来保持控制循环的状态。当然,可以在循环初始化程序语句中声明此对象。我只是将其移至for循环之外,以表明它是可能的。
我们还可以在循环初始化程序语句中初始化多个变量。这是一个例子:
for(int i=0, n=10; i < n; i++) { }
注意如何声明两个变量。 i变量用作迭代计数器,n变量用作迭代边界。还要注意,循环条件现在如何将i变量与n变量进行比较,而不是将其与常量进行比较。
条件语句
条件语句是for循环括号内的第二条语句。该语句是一个表达式,其结果应为" true"或者" false"。如果该语句的评估结果为" true",则" for"循环将再评估一次。如果该语句的计算结果为" false",则不再执行" for"循环,并且执行跳转到" for"循环的主体之后的第一个语句。
这是一个for
循环示例,条件语句用粗体标出:
for(int i=0; i < 10; i++) { }
后期迭代操作
for循环中的第三条语句是后迭代语句。该语句在" for"循环的每次迭代之后执行。该语句通常用于更新控制条件语句的变量。例如,增加一个计数器变量。
这是一个for
循环示例,其中后迭代语句用粗体标出:
for(int i=0; i < 10; i++) { }
迭代后语句使变量" i"递增。在条件语句中,将变量" i"与值" 10"进行比较。如果" i"小于" 10",则" for"循环将再执行一次。
迭代后语句是可选的,类似于循环初始化程序语句。这是一个没有后迭代语句的示例:
MyLoop loop = new MyLoop(10); for( ; loop.loopAgain() ; )) { }
每个循环的Java
在Java 5中,添加了for
循环的变体。这种变化称为"针对每个"循环。这是一个Java for each循环示例:
String strings = {"one", "two", "three" }; for(String aString : strings) { System.out.println(aString); }
注意String
数组。这个数组用于for each
循环中。注意如何在for循环的括号内声明一个String aString变量。对于" for each"循环的每次迭代,此变量将绑定到" strings"数组中的" String"对象之一。对于字符串数组中的每个元素,for each循环将重复一次。
Java" for each"循环也可以与泛型集合一起使用。我已经在我的Java Iterable教程(它是Java Collections教程的一部分)中对此进行了更详细的说明。
continue命令
Java包含一个" continue"命令,该命令可在Java" for"(和" while")循环中使用。 "继续"命令位于" for"循环的主体内。当满足"继续"命令时,Java虚拟机将跳至循环的下一个迭代,而无需执行更多的"循环"。 for循环体的下一次迭代将与其他循环一样进行。如果该迭代也满足" continue"命令,则该迭代也将跳至下一个迭代,依此类推。
这是一个for
循环内的简单continue
例子:
String[] strings = { "John", "Hyman", "Abraham", "Jennifer", "Ann" }; int wordsStartingWithJ = 0; for(int i=0; i < strings.length; i++) { if(! strings[i].toLowerCase().startsWith("j")) { continue; } wordsStartingWithJ++; }
注意" for"循环中的" if"语句。这个if语句检查string数组中的每个String是否都不以字母j开头。如果不是,则执行"继续"命令,并且" for"循环继续到下一个迭代。
如果string数组中的当前String确实以字母j开头,则执行if语句之后的下一个Java语句,并将变量wordsStartingWithJ递增1.
" continue"命令也可以在" for each"循环内使用。这是上一个示例的"针对每个"版本:
String[] strings = { "John", "Hyman", "Abraham", "Jennifer", "Ann" }; int wordsStartingWithJ = 0; for(String aString : strings) { if(! aString.toLowerCase().startsWith("j")) { continue; } wordsStartingWithJ++; }
for循环看起来有些不同,但是逻辑和函数保持不变。
break命令
" break"命令是在Java" for"(和" while")循环内运行的命令。当满足break
命令时,即使循环条件仍然为真,Java虚拟机也会脱离for
循环。一旦满足" break"命令,就不再执行" for"循环的迭代。这是for
循环中的break
命令示例:
String[] strings = { "John", "Hyman", "Abraham", "Jennifer", "Ann" }; int wordsStartingWithJ = 0; for(int i=0; i < strings.length; i++) { if(strings[i].toLowerCase().startsWith("j")) { wordsStartingWithJ++; } if(wordsStartingWithJ >= 3) { break; } }
注意" for"循环中的第二条" if"语句。该if语句检查是否找到3个或者多个以字母j开头的单词。如果是,则执行break
命令,然后程序退出for
循环。
像continue
命令一样,break
命令也可以在for each
循环中使用。这是之前的示例,而是使用for each
循环:
String[] strings = { "John", "Hyman", "Abraham", "Jennifer", "Ann" }; int wordsStartingWithJ = 0; for(String aString : strings) { if(aString.toLowerCase().startsWith("j")) { wordsStartingWithJ++; } if(wordsStartingWithJ >= 3) { break; } }
for循环仅稍有不同,但整体函数保持不变。
Java for Loops中的可变可见性
在Java for循环的括号或者主体内声明的变量仅在for循环主体内可见。对于" for each"循环的变量也是如此。看一下这个Javafor
循环示例:
for(int i=0; i<10; i++) { String iAsNo = String.valueOf(i); }
变量" i"和" iAsNo"仅在" for"循环体内可见。在for
循环体之外不能引用它们。
这个Javafor each
循环示例中的aString
变量也是如此:
String strings = {"one", "two", "three" }; for(String aString : strings) { System.out.println(aString); }
由于aString变量是在Java for Each循环的括号内声明的,因此该变量仅在for each循环内部可见。