Java/循环结构

顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,甚至您也不清楚应该是多少次——它依情况而定,那么您需要在程序中使用循环结构。

Java中有三种主要的循环结构:while,do...while,for。

while是最基本的循环,它的结构为:

while( 判断条件 ) { 
   循环内容
  }

当执行到while语句时,会首先判断括号中的条件是否满足(真/假),若真,则进入循环;反之则跳过循环。进入循环后,会一直执行循环内容。执行结束后返回,再次判断括号中的条件,决定是否再次进入循环,如此往复……直到括号中的条件为假,跳出循环为止。

括号中的判断条件,可以是布尔值或者布尔表达式,甚至数字(0代表false,而正数代表true,这种用法在Java中并不常见)。

package wikibooks;

public class Exercise {
    public static void main(String args[]){
        int num = 1;
        while( num < 3 ){ //判断是否进入循环         
        	System.out.println( "num=" + num + "<3,不能跳出循环" ); 
                   num++;
     }
        System.out.println( "num=" + num + ">=3,跳出循环" );
    }
}

执行结果:

num=1<3,不能跳出循环
num=2<3,不能跳出循环
num=3>=3,跳出循环

有一种特殊的循环叫做“无限循环”或者“死循环”,跳出循环的条件永远无法满足。如:

package wikibooks;

public class Exercise {
    public static void main(String args[]){

        while( true ){
        	System.out.println( "不断重复\n直到永远");
        }
        
    }
}

执行结果:

不断重复
直到永远
不断重复
直到永远
...

这种情况一般被认为是危险的,因为程序不能停止。但我们有时会用到while(true)这样的用法,并利用其它方法跳出循环。(参见后面的break和continue)

do...while

编辑

对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。

比如我们想知道一个维基人的身体是否达到体育标准,我们不能直接判断。我们需要让他进行锻炼,然后进行体质测试,这之后进行判断。如果合格,则不再进行测试;反之,则此维基人将继续进行体育锻炼,再次测试。如此循环。

此过程可概括为先执行,后判断。do...while即此种用法。

do{
    体育锻炼;
    体质测试;
}while(!测试结果);
package wikibooks;

public class Exercise {
    public static void main(String args[]){
        double guess;
        do{
            guess = Math.random();      //给guess一个0-1之间的随机数值
            System.out.println( guess );
        }while( guess > 0.1 );          //判断guess是否大于0.1
    }
}

由于guess是随机数,程序执行的结果是不确定的。其中一次执行的结果是:

0.4478991576615713
0.9647035938994791
0.645764446922368
0.6285696297572023
0.08508127031573565

虽然所有循环结构都可以用while或者do...while表示,Java提供了另一种语句——for,使一些循环结构变得更加简单。

for循环的基本结构为

for(初始化语句; 进入循环条件; 循环末执行语句) {
   循环内容
  }

for循环极其适用于那些限定循环次数的循环结构。一种常用的形式如:

package wikibooks;

public class Exercise {
    public static void main(String args[]){
        int i;
        for( i = 0; i < 5; i++ ){
            System.out.println( i );
        }
    }
}

执行到for语句时,首先i被赋值为0;然后判断进入循环条件 i < 5,满足则进入循环;执行完循环体之后,执行循环末语句i++;再次判断进入循环条件……

执行结果:

0
1
2
3
4

理论上,for语句也可以实现while语句的所有功能——将括号中第一和第三部份留空,则while和for循环就完全一致了。但在使用时,根据需要灵活使用,会更方便。在不知道从第几个版本开始,for语句开始支持对foreach的支持。一般的形式如下:

int[] data = {1, 2, 3, 4, 5};
for(int t : data){
    System.out.println(t);
}

执行结果:

1
2
3
4
5

以上代码中的for遍历了data中的所有数据,每次将数据存储在局部变量t中并运行一次循环块。在Java中,所有的数组均可以用该形式的for循环。另外,实现了java.lang.Iterable<T>接口的类,也可以使用该for循环,比如java.util.Collection。