Java 循環(huán)語句
循環(huán)結構能夠讓程序員以最少的精力去完成大量重復的工作,它可以讓計算機根據(jù)條件做循環(huán)計算,當條件成立時繼續(xù)循環(huán),當條件不成立時結束循環(huán)。
依據(jù)前面所學的知識,如果我們想在屏幕上依次打印1到5,可以編寫以下程序:
// PrintNums.java
class PrintNums {
public static void main(String[] args) {
// 依次打印1到5
System.out.println("1");
System.out.println("2");
System.out.println("3");
System.out.println("4");
System.out.println("5");
}
}
運行結果:
1
2
3
4
5
但是這種編寫代碼的方案存在一些弊端:
- 不靈活:如果我們想要更改需求,打印從6到10,那么就不得不逐行更改;
- 難于維護:如果有大量代碼,更容易產(chǎn)生
bug
; - 伸縮性差:依次打印從1到5貌似很簡單,如果需求變?yōu)榇蛴?到100呢?這意味著需要編寫大量的代碼。
使用循環(huán)結構,就可以解決上述弊端。下面我們打開代碼編輯器,新建一個LoopPrintNums.java
,復制如下代碼:
// LoopPrintNums.java
class LoopPrintNums {
public static void main(String[] args) {
for(int i = 1; i <= 10; i ++) {
System.out.print(i + "\t");
}
}
}
運行結果:
1 2 3 4 5 6 7 8 9 10
聰明的你可能發(fā)現(xiàn),如果將i <= 10
改為 i <= 100
,屏幕將依次從1打印100。
上述代碼中,我們看到不需要再去編寫多條打印語句,同樣得到了我們想要的結果,代碼量大大減少。那么上述代碼具體有什么含義呢,為什么這樣寫就實現(xiàn)了多個數(shù)字的打印呢?在本小節(jié)中,我們就會進行詳細介紹。
1. while 循環(huán)
1.1 語法
while
循環(huán)是最簡單的循環(huán)形式。我們先來看看它的基本用法:
while (條件) {
// 循環(huán)體,條件成立時執(zhí)行
...
}
// 循環(huán)完成后執(zhí)行
while
循環(huán)在每次循環(huán)開始前,首先會判斷條件是否成立,如果計算結果為true
, 就會執(zhí)行循環(huán)體內(nèi)部語句。如果計算結果為false
,會跳出循環(huán),執(zhí)行后續(xù)代碼。
1.2 實例
對于打印從1到5的例子,可以使用while
循環(huán)可以這樣寫:
public class WhileLoop1 {
public static void main(String args[]) {
int i = 1;
while (i <= 5) {
System.out.println(i); // 打印i
i ++; // i自增1
}
}
}
你也許注意到在循環(huán)體內(nèi)部,除了打印變量i
的值,還有一個語句:i ++
,這個語句的作用是讓變量i
自增1。如果沒有這個語句,i
的值永遠不會改變,所以循環(huán)條件永遠成立,程序?qū)⑾萑胨姥h(huán),直到將資源耗盡才會停止,所以要杜絕編寫死循環(huán)代碼。
Tips:如果循環(huán)的條件永遠不會變成
false
(比如使用字面量true
作為條件),則稱這種循環(huán)為無限循環(huán)或死循環(huán)。循環(huán)體內(nèi)的代碼會無限地重復執(zhí)行,直到中斷。
再看一個例子,得到1到100的累加和:
public class WhileLoop2 {
public static void main(String[] args) {
int sum = 0; // 累加和
int i = 1;
while (i <= 100) {
sum = sum + i; // 使sum和i相加,并將值再次賦值給sum
i ++; // i自增1
}
System.out.println("1到100的累加和為:" + sum);
}
}
運行結果:
1到100的累加和為:5050
我們來對程序進行解析:
- 定義兩個變量
sum
和i
分別用于存放累加和以及要累加的數(shù)字。 - 循環(huán)開始前判斷條件
i <= 100
是否成立,此時i = 1
,成立,執(zhí)行循環(huán)體內(nèi)代碼。 - 循環(huán)體內(nèi)代碼第一次執(zhí)行,
sum = 1
,i
自增1變?yōu)?。 - 再次判斷循環(huán)條件,成立就繼續(xù)執(zhí)行循環(huán)體,直到
i = 100
,自增1 變?yōu)?01,此時條件不成立。執(zhí)行循環(huán)后面的代碼。 - 執(zhí)行打印語句,打印最終的
sum
值,程序結束。
2. do while 循環(huán)
2.1 語法
do while
循環(huán)的功能與while
循環(huán)類似,不同點在于:while
循環(huán)是先判斷條件,再執(zhí)行循環(huán)體;而do while
循環(huán)則是先執(zhí)行循環(huán)體,再判斷條件,如果條件成立繼續(xù)執(zhí)行循環(huán),條件不成立則終止循環(huán)。do while
循環(huán)的語法如下:
do {
// 循環(huán)體
} while (條件);
無論條件成立與否,do while
循環(huán)都至少執(zhí)行一次。而while
循環(huán)可能一次都不會執(zhí)行。
2.2 實例
我們現(xiàn)在使用 do while
循環(huán)實現(xiàn)1到100的累加求和,代碼如下:
public class DoWhileLoop {
public static void main(String[] args) {
int sum = 0; // 累加和
int i = 1;
do {
sum = sum + i; // 使sum和i相加,并將值再次賦值給sum
i ++; // i自增1
} while (i <= 100);
System.out.println("1到100的累加和為:" + sum);
}
}
運行結果:
1到100的累加和為:5050
3. for 循環(huán)
3.1 語法
下面是for
循環(huán)的語法結構:
for (變量聲明; 條件; 迭代語句) {
// 循環(huán)體
}
for
循環(huán)是一種特殊的while
循環(huán),也是被使用最廣泛的循環(huán)。它使用計數(shù)器來實現(xiàn)循環(huán)。在關鍵字 for
后面的括號中,會有三個語句,第一個語句是變量聲明語句,允許聲明一個或多個整型變量;第二個語句是條件,條件的檢測方式與while
循環(huán)相同(每次循環(huán)開始前判斷條件成立與否);第三個語句是迭代語句,雖然可以是任何語句,但該語句通常用于遞增或遞減變量。
3.2 實例
我們使用for
循環(huán)連續(xù)打印5行”慕課網(wǎng)真棒“的字樣,代碼如下:
public class ForLoop1 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i ++) {
System.out.println("慕課網(wǎng)真棒");
}
}
}
運行結果:
慕課網(wǎng)真棒
慕課網(wǎng)真棒
慕課網(wǎng)真棒
慕課網(wǎng)真棒
慕課網(wǎng)真棒
我們現(xiàn)在使用for
來實現(xiàn)1到100的累加求和,代碼如下:
public class ForLoop2 {
public static void main(String[] args) {
int sum = 0; // 累加和
for (int i = 1; i <= 100; i ++) {
sum += i; // 加和賦值運算
}
System.out.println("1到100的累加和為:" + sum);
}
}
運行結果:
1到100的累加和為:5050
程序解析:
在執(zhí)行循環(huán)體前,會先執(zhí)行括號中的變量聲明語句int i = 1
,它定義了一個計數(shù)器變量i
并且賦值為1(注意這個語句只執(zhí)行一次)。然后會執(zhí)行條件判斷語句i <= 100
,顯然條件成立,執(zhí)行循環(huán)體,循環(huán)體執(zhí)行完成后會才會執(zhí)行括號中的第三個語句i ++
,再次判斷條件是否成立,直到當i
的值為100時,最后一次執(zhí)行循環(huán)體,這個時候i
再次自增1
為101
,條件不成立,結束循環(huán)。
實際使用中,通常使用for
循環(huán)來遍歷一個數(shù)組,我們將在 Java 數(shù)組小節(jié)舉例介紹。
for
循環(huán)中第一個語句,變量聲明語句可以一次聲明多個整型變量,實例代碼如下:
public class ForLoop2 {
public static void main(String[] args) {
for (int i = 1, j = 10; i <= 10; i++, j--) {
System.out.print(i + "\t");
System.out.print(j + "\t");
}
}
}
運行結果:
1 10 2 9 3 8 4 7 5 6 6 5 7 4 8 3 9 2 10 1
另外,for
循環(huán)還可以缺省變量聲明語句、循環(huán)條件和迭代語句,實例:
// 缺省變量聲明語句
for (int i = 0; ; i ++) {
// 語句
}
// 缺省循環(huán)條件語句和迭代語句
for (int i = 0; ; ) {
// 語句
}
// 缺省所有語句
for (;;) {
// 語句
}
但請注意,通常情況下不建議這樣寫。
4. for each 循環(huán)
由于學習 for each
循環(huán)需要一些數(shù)組和集合的前置知識,我們將會在 Java 數(shù)組小節(jié)舉例講解。
5. break 和 continue 關鍵字
我們可以使用break
和continue
語句來重定向程序執(zhí)行流。
5.1 break
break
關鍵字可以出現(xiàn)在一個循環(huán)中,用以跳出當前循環(huán)。我們來看一個實例:
public class BreakKeywords1 {
public static void main(String[] args) {
for (int i = 1; i <= 10; i ++) {
if(i == 3) { // 條件語句
System.out.println("當i等于3時,終止循環(huán)!");
break;
}
System.out.println(i);
}
}
}
運行結果:
1
2
當i等于3時,終止循環(huán)!
上面是一段循環(huán)打印數(shù)字的代碼,當循環(huán)到達第3次迭代時,執(zhí)行條件分支中的語句,將終止循環(huán)。注意:break
語句通常配合if
語句使用。
對于多層循環(huán)的情況,break
語句只能終止它自己所在的那一層循環(huán),并不會影響到外層循環(huán)。請閱讀如下代碼:
public class BreakKeywords2 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i ++) {
// 打印i的值
System.out.println(i);
for (int j = 1; j<=5; j ++) {
if(j == 3) { // 條件語句
System.out.println("當j等于3時,終止循環(huán)!");
break;
}
// 打印j的值
System.out.println(j);
}
}
}
}
運行結果:
1
1
2
當j等于3時,終止循環(huán)!
2
1
2
當j等于3時,終止循環(huán)!
3
1
2
當j等于3時,終止循環(huán)!
4
1
2
當j等于3時,終止循環(huán)!
5
1
2
當j等于3時,終止循環(huán)!
上面的代碼有兩個for
循環(huán)嵌套,break
語句位于內(nèi)層循環(huán),所以當表達式j == 3
成立時,會跳出內(nèi)層循環(huán),進而繼續(xù)執(zhí)行外層循環(huán)。
5.2 continue
continue
關鍵字可以跳過當次循環(huán),繼續(xù)執(zhí)行下一次循環(huán),我們來看一個實例:
public class ContinueKeywords {
public static void main(String[] args) {
for (int i = 1; i <= 5; i ++) {
if(i == 3) {
System.out.println("當i等于3時,跳過~");
continue;
}
System.out.println(i);
}
}
}
運行結果:
1
2
當i等于3時,跳過~
4
5
在多層嵌套的循環(huán)中,continue
語句只能跳過它自己所在位置的循環(huán)。
6. 小結
本節(jié)中,我們依次介紹了Java
中的四種循環(huán)結構:while
循環(huán)、do while
循環(huán)、for
循環(huán)以及for each
循環(huán)。并且介紹了break
和continue
關鍵字在循環(huán)中的使用。
其中,while
循環(huán)的循環(huán)體可能一次都不執(zhí)行,而do while
循環(huán)的循環(huán)體至少執(zhí)行一次。
for
循環(huán)通過計數(shù)器實現(xiàn)復雜循環(huán)。for each
循環(huán)可以直接遍歷數(shù)組的每個元素。
在使用循環(huán)結構編寫業(yè)務代碼時,為了避免死循環(huán),一定要確保循環(huán)條件能夠被影響。