Java for 循环
for循环可以重复执行一系列的操作,直到给定的条件为false时终止执行。简单示例如下:
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循环的结果是循环的主体执行了10次。每次执行时i都小于10(0到9)。
上面例子中实际上并不需要for循环体的花括号。如果省略花括号,则只执行for循环语句之后的第一个Java语句。示例如下:
for(int i = 0; i < 10; i++)
System.out.println("i is 1: " + i); // 循环主体,会在循环内执行
System.out.println("second line"); // 循环结束后执行
在这个例子中,在for循环中只执行第一个System.out.println()语句。第二个System.out.println()语句会直到for循环执行完成之后才会执行。
关于for循环常见的错误就是忘记循环体的花括号。因此,在for循环体首尾放置花括号内是一个好习惯。
循环初始化,循环条件和迭代后操作
如前所述,for循环包含三个用分号分隔的语句。示例如下:
for(int i=0; i < 10; i++) {
System.out.println("I is: " + i);
}
这些语句在for循环的执行过程中起着不同的作用。它们分别是:
- 循环初始化
- 循环条件
- 迭代后操作
我将在下面更详细地解释这些。
循环初始化
循环初始化语句只在for循环开始之前执行一次。循环初始化语句通常用于初始化循环条件语句中使用的变量或对象。在上面的例子中,循环初始化语句声明了一个int变量 i并赋值为0。
for(int i=0; i < 10; i++) {
System.out.println("i is: " + i);
}
如果你不需要循环初始化,也可以选择不写这部分语句。示例如下:
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(int i=0; i < 10; i++) {
}
迭代后操作
for循环中的第三条语句是迭代后操作语句。这个语句在for循环的每次迭代之后执行。此语句通常用于更新控制循环条件的变量。例如,增加计数器变量。
for(int i=0; i < 10; i++) {
}
迭代后操作语句让变量i自增。在条件语句中,变量i与值10进行比较。如果i小于10,for循环会再次执行一次。
迭代后操作语句是可选的,就像循环初始化语句一样。下面是一个简单例子:
MyLoop loop = new MyLoop(10);
for( ; loop.loopAgain() ; )) {
}
Java for each 循环
在Java 5中增加了for循环的变体。这种变化被称为 for each 循环。示例如下:
String strings = {"one", "two", "three" };
for(String aString : strings) {
System.out.println(aString);
}
注意上面的String数组,这个数组用于每个循环。注意在for循环的括号内声明了一个 String aString变量。对于for each循环的每次迭代,这个变量将被绑定到 strings数组中的一个String对象,而且该数组中的String对象会依次绑定一次。
for each循环的也可以用于泛型集合。详细内容请参看后续章节。
continue关键字
Java包含一个continue关键字,它可以在Java中用于 for(和while)循环。 continue关键字放在for循环体内。当continue命令被满足时,Java虚拟机跳转到循环的下一个迭代,而不执行continue后面的for循环体。 for循环体的下一次迭代将继续进行。如果该次迭代也符合continue命令,则该迭代也将跳到下一次迭代,依此类推。
下面是for循环中的一个简单的 continue示例:
String[] strings = {
"John", "Jack", "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语句用于检查字符串数组中的每个字符串是否以字母j开头。如果不是,则执行continue命令,for循环继续下一次迭代。
如果字符串数组中的当前字符串是以字母j开头,则会执行if语句后面的下一个Java语句,并且变量 wordsStartingWithJ将增加1。
continue命令也适用于for each循环。示例如下:
String[] strings = {
"John", "Jack", "Abraham", "Jennifer", "Ann" };
int wordsStartingWithJ = 0;
for(String aString : strings) {
if(! aString.toLowerCase().startsWith("j")) {
continue;
}
wordsStartingWithJ++;
}
这两个for循环看起来有些不一样,但实际上逻辑和功能都是一样的。
break关键字
break命令是一个在for(和while)循环中使用的命令。当符合break命令的条件时,即使循环条件仍然为真,Java虚拟机也会跳出for循环。一旦符合break命令,就不会再执行for循环的迭代。示例如下:
String[] strings = {
"John", "Jack", "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语句检查找到以字母j开始的字符串数量大于等于3时,会执行break命令,程序跳出for循环。
像continue命令一样,break命令也适用于 for each循环。示例如下:
String[] strings = {
"John", "Jack", "Abraham", "Jennifer", "Ann" };
int wordsStartingWithJ = 0;
for(String aString : strings) {
if(aString.toLowerCase().startsWith("j")) {
wordsStartingWithJ++;
}
if(wordsStartingWithJ >= 3) {
break;
}
}
for循环中变量可见性
在括号内或者在for循环主体中声明的变量只对for循环体中可见。对于for each循环的变量也是这样。看看下面这个Java for循环的例子:
for(int i=0; i<10; i++) {
String iAsNo = String.valueOf(i);
}
变量i和iAsNo只在for循环体内可见。它们不能在for循环体外被引用。
对于下面for each示例中的aString变量也是这样:
String strings = {"one", "two", "three" };
for(String aString : strings) {
System.out.println(aString);
}
由于是在for each循环的括号内声明的aString变量,因此该变量只在循环体内部可见。
下一篇: Java while循环