Java While循环

时间:2020-01-09 10:36:57  来源:igfitidea点击:

Java的while循环类似于for循环。 while循环使Java程序可以在某些条件为真时重复执行一组操作。

Javawhile循环存在两个变体。常用的" while"循环和较少使用的" while while"版本。在本文中,我将介绍两个" while"循环版本。

Java while循环

让我们首先看一下Javawhile循环中最常用的变体。这是一个简单的Java while循环示例:

int counter = 0;

while(counter < 10) {

    System.out.println("counter: " + counter);

    counter++;
}

该示例显示了一个while循环,只要counter变量小于10,它就会执行循环主体。在while循环主体中,counter会递增。最终," counter"变量将不再小于10,并且" while"循环将停止执行。

这里是另一个while例子使用boolean做出比较:

boolean shouldContinue = true;

while(shouldContinue == true) {

    System.out.println("running");

    double random = Math.random() * 10D;

    if(random > 5) {
        shouldContinue = true;
    } else {
        shouldContinue = false;
    }

}

这个Java while例子测试了boolean变量shouldContinue来检查while循环是否应该执行。如果shouldContinue变量的值为true,则while循环体将执行一次。如果shouldContinue变量的值为false,则while循环停止,并在while循环之后的下一条语句处继续执行。

在while循环体内,会生成一个介于0到10之间的随机数。如果随机数大于5,则将" shouldContinue"变量设置为" true"。如果随机数小于或者等于5,则" shouldContinue"变量应设置为" false"。

像for循环一样,大括号在while循环主体周围是可选的。如果省略花括号,则while循环主体将仅由以下第一个Java语句组成。这是一个Java" while"示例,说明了这一点:

while(iterator.hasNext())
  System.out.println("next: " + iterator.next()); // executed in loop
  System.out.println("second line");              // executed after loop

在此示例中,仅在while循环内执行了第一个System.out.println()语句。直到" while"循环完成后,才执行第二个" System.out.println()"语句。

遗忘while循环体周围的花括号是一个常见的错误。因此,仅将它们放在while循环主体周围是一个好习惯。

Java while循环

Javawhile循环的第二个变体是do while构造。这是一个Java" do while"示例:

InputStream inputStream  =
        new FileInputStream("data/text.xml");

int data;
do {
    data = inputStream.read();

} while(data != -1);

注意," while"循环条件现在移至" do while"循环主体之后。 " do while"循环主体始终至少执行一次,然后在" while"循环条件为" true"时重复执行。

两种" while"循环变化之间的主要区别在于," while"循环总是在测试" while"循环条件之前至少执行一次。在本文开头解释的正常的while循环变化不是这种情况。

Javawhile循环的两个变体在不同情况下派上用场。我主要使用了第一个" while"循环变体,但是在某些情况下,我使用了第二个变体。

continue命令

Java包含一个" continue"命令,该命令可以在Java" while"(和" for")循环中使用。在continue命令被放置在while循环体内部。当满足" continue"命令时,Java虚拟机将跳至循环的下一个迭代,而无需执行更多的" while"循环主体。 while循环主体的下一次迭代将与其他循环一样进行。如果该迭代也满足" continue"命令,则该迭代也将跳至下一个迭代,依此类推。

这是一个while循环内的简单continue示例:

String[] strings = {
    "John", "Hyman", "Abraham", "Jennifer", "Ann" };

int wordsStartingWithJ = 0;
int i=0;

while( i < strings.length ) {
    if(! strings[i].toLowerCase().startsWith("j")) {
        i++;
        continue;
    }

    wordsStartingWithJ++;
    i++;
}

注意while循环中的if语句。这个if语句检查string数组中的每个String是否都不以字母j开头。如果不是,则执行"继续"命令,而"循环"继续进行到下一个迭代。

如果string数组中的当前String确实以字母j开头,则执行if语句之后的下一个Java语句,并将变量wordsStartingWithJ递增1.

continue命令也可以在do while循环内使用。这是上一个示例的" do while"版本:

String[] strings = {
    "John", "Hyman", "Abraham", "Jennifer", "Ann" };

int wordsStartingWithJ = 0;
int i=0;

do {
    if(! strings[i].toLowerCase().startsWith("j")) {
        i++;
        continue;
    }

    wordsStartingWithJ++;
    i++;
} while( i < strings.length );

注意,此版本的while循环要求string数组至少包含一个元素,否则在do while循环的第一次迭代期间尝试索引到位置0的数组时将失败。

break命令

" break"命令是在Java" while"(和" for")循环内运行的命令。当满足break命令时,即使循环条件仍然为真,Java虚拟机也会退出while循环。一旦满足" break"命令,就不会再执行" while"循环的迭代。这是while循环内的break命令示例:

String[] strings = {
    "John", "Hyman", "Abraham", "Jennifer", "Ann" };

int wordsStartingWithJ = 0;
int i=0;

while(i < strings.length; ) {
    if(strings[i].toLowerCase().startsWith("j")) {
        wordsStartingWithJ++;
    }

    if(wordsStartingWithJ >= 3) {
        break;
    }
    i++;
}

注意while循环内的第二条if语句。该if语句检查是否找到3个或者多个以字母j开头的单词。如果是,则执行break命令,程序退出while循环。

continue命令一样,break命令也可以在do while循环中使用。这是之前的示例,而是使用do while循环:

String[] strings = {
    "John", "Hyman", "Abraham", "Jennifer", "Ann" };

int wordsStartingWithJ = 0;
int i=0;

do {
    if(strings[i].toLowerCase().startsWith("j")) {
        wordsStartingWithJ++;
    }

    if(wordsStartingWithJ >= 3) {
        break;
    }
    i++;

} while( i < strings.length; )

注意,while循环的这种变化要求string数组始终至少包含一个元素。如果不是这样,它将在尝试访问数组的第一个元素(索引为0)时在do while循环的第一次迭代期间失败。

while循环中的可变可见性

在Java" while"循环内声明的变量仅在" while"循环体内可见。看这个while循环示例:

int count = 0;

while(count < 10) {
    String name = employees[i].getName();

    count++;
}

while循环体完成之后,仍然可以看到count变量,因为count变量是在while循环体之外声明的。但是name变量是不可见的,因为它是在while循环体内声明的。因此," name"变量仅在" while"循环体内可见。