在 Java 中执行 While 循环与 For 循环以进行计数

Do While Loops Versus For Loops in Java for Counting

在计算时,应该使用 do-while 循环还是 for 循环?因为这个:

class Main {
  public static void main(String[] args) {
    int times = 1;
    do {
      System.out.println("I have printed " + times + " times.");
      times++;
    } while (times < 6);
  }
}

似乎与此完全相同:

class Main {
  public static void main(String[] args) {
    for (int times = 1; times < 6; times++) {
      System.out.println("I have printed " + times + " times.");
    }
  }
}

速度有区别吗?偏爱?情况?个人怪癖?某种 "Java social taboo"?我不知道。两者似乎都可以用于有效计数,只是需要更多。并且都打印 exact 同样的东西。

System.out.println("Many thanks!!");

你是对的,它们做同样的事情(除了一个从 0 开始计数,另一个从 1 开始计数,但这只是一个实现细节)。如果您的程序提前(在循环开始之前)知道您希望循环迭代多少次,大多数 Java 开发人员会告诉您使用 for 循环。这就是它的设计目的。

while 循环或 do while 循环更适用于您在退出循环之前查找特定值或条件的情况。 (类似于 count >= 10userInput.equals("N")。任何计算为布尔值 True/False 的东西。)

面对这些困境时,请以可读性和熟悉性为目标。您不应该关心微优化。注重可读性并清楚地传达您的意图。像其他人在类似情况下做的那样。

就像@Bill-The-Lizard 说的那样,while 循环向你选择它的代码的 reader 建议,因为你没有计算,而是重复直到条件满足遇见了。至少一次 - 否则你会选择 while(...){ } 循环。

换句话说,fordo {} while()while() { }大体上是一样的。但是可能会更好地传达您对特定逻辑的意图。

这取决于程序员选择何时使用for循环或do while循环,但大多数程序员遵循的一般做法是

  • For循环
    当您知道循环将执行预定义的次数时(一般做法,因为您也可以使用 for(;true;) 永远循环)。 例如一个循环 运行s 10 次或 n 次,其中 n 是一个变量


for(int i = 0; i < n; i++) {
    //Do something
}
  • While 循环
    当您知道循环应该在将特定条件评估为真后终止,否则您希望循环永远 运行(如 while(true))并检查 while 循环内的中断条件。
    此外,当您首先无​​法弄清楚条件并从 while(true) 开始时,while 循环是首选,但是一旦您在循环内编写代码,您就会很好地理解正在发生的事情并了解要检查哪些条件因此何时退出循环。 例如


while(x != 0) {
    //Do something;
    x--;
}


while(true) {
    // some code to execute on which the condition depends
    if(condition is true) {
        break;
    }
}
  • 执行 while 循环
    Do while 循环类似于 while 循环,但有细微差别。也就是说,它允许在不检查条件(在 while 语句中指定,但您仍然可以在块内评估条件(花括号))的情况下进行第一次迭代。

我认为它更像是一种可读性和语法糖。这个 while 条件

while (condition)

也可以写成

for (; condition; )

但显然第一个看起来好多了,可读性也更好。

按照惯例,大多数 Java 开发人员使用 for 循环。 Effective Java 建议使用 for 循环而不是 while 循环,因为循环变量可以使用更紧凑的范围,从而减少错误。 http://www.corejavaguru.com/effective-java/items/45

Java 的最新版本还允许以下内容

    IntStream.range(0, 6).forEach(
            i -> System.out.println("I have printed " + i + " times.")
    );

除了个人喜好,这个的优点是索引由运行时维护,不需要程序员++i