循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)分兩大類瞒御,一類是當(dāng)型,一類是直到型神郊。
當(dāng)型:當(dāng)布爾表達(dá)式條件為true時(shí)肴裙,反復(fù)執(zhí)行某語(yǔ)句趾唱,直到布爾表達(dá)式的值為false時(shí)才停止循環(huán)。
直到型:先執(zhí)行某語(yǔ)句蜻懦,再判斷布爾表達(dá)式甜癞,如果為true,再執(zhí)行某語(yǔ)句宛乃,如此反復(fù)悠咱,直到布爾表達(dá)式條件為false時(shí)才停止循環(huán)。
while循環(huán)
語(yǔ)法結(jié)構(gòu):
while (布爾表達(dá)式) {
循環(huán)體;
}
圖1while流程圖
在循環(huán)剛開(kāi)始時(shí)征炼,會(huì)計(jì)算一次“布爾表達(dá)式”的值析既,若條件為真,執(zhí)行循環(huán)體谆奥。而對(duì)于后來(lái)每一次額外的循環(huán)眼坏,都會(huì)在開(kāi)始前重新計(jì)算一次。
語(yǔ)句中應(yīng)有使循環(huán)趨向于結(jié)束的語(yǔ)句雄右,否則會(huì)出現(xiàn)無(wú)限循環(huán)–––"死"循環(huán)空骚。
【示例1】while結(jié)構(gòu)1到100之間的累加和
public class WhileTest {
public static void main(String[] args) {
int? i = 0;
int? sum = 0;
while (i <= 100) {?? // 1+2+3+…+100=?
sum += i;?? //sum = sum+i;
i++;
}
System.out.println("Sum= " + sum);
}
}
示例1運(yùn)行效果圖
do-while循環(huán)
語(yǔ)法結(jié)構(gòu):
do {
循環(huán)體;
} while(布爾表達(dá)式);
圖2 do-while流程圖
先執(zhí)行循環(huán)體,然后判斷布爾表達(dá)式擂仍,do-while循環(huán)循環(huán)體至少執(zhí)行一次囤屹。
【示例2】1-100之間的累加和
public class Test {
public static void main(String[] args) {
int i = 0;
int sum = 0;
do {
sum += i; // sum = sum + i
i++;
} while (i <= 100);
System.out.println("Sum= " + sum);
}
}
示例2運(yùn)行效果圖
【示例3】while與do-while的區(qū)別
public class Test {
public static void main(String[] args) {
int a = 0;
while(a<0){
System.out.println(a);
a++;
}
System.out.println("-----");
a=0;
do{
System.out.println(a);
a++;
} while (a<0);
}
}
示例3運(yùn)行效果圖
for循環(huán)
語(yǔ)法結(jié)構(gòu):
for (初始表達(dá)式;布爾表達(dá)式;迭代因子) {
循環(huán)體;
}
圖3 or循環(huán)流程圖
for循環(huán)語(yǔ)句是支持迭代的一種通用結(jié)構(gòu),是最有效逢渔、最靈活的循環(huán)結(jié)構(gòu)肋坚。for循環(huán)在第一次反復(fù)之前要進(jìn)行初始化形纺。隨后众眨,它會(huì)進(jìn)行條件測(cè)試,而且在每一次反復(fù)的時(shí)候妻坝,進(jìn)行某種形式的“步進(jìn)”盲赊。
初始化部分設(shè)置循環(huán)變量的初值
條件判斷部分為任意布爾表達(dá)式
迭代因子控制循環(huán)變量的增減
for循環(huán)在執(zhí)行條件測(cè)試后铣鹏,先執(zhí)行程序部分,再執(zhí)行步進(jìn)哀蘑。
【示例4】for循環(huán)舉例
public class ForTest {
public static void main(String args[]) {
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
System.out.println("Sum= " + sum);
for(int i=9;i>0;i--){
System.out.print(i+"诚卸、");
}
System.out.println();
for(int i=90;i>0;i-=3){
System.out.print(i+"、");
}
System.out.println();
}
}
示例4運(yùn)行效果圖
Java里唯一用到逗號(hào)運(yùn)算符的地方就是for循環(huán)的控制表達(dá)式绘迁。在控制表達(dá)式的初始化和步進(jìn)控制部分合溺,我們可以使用一系列由逗號(hào)分隔的表達(dá)式。而且那些表達(dá)式均會(huì)獨(dú)立執(zhí)行缀台。
【示例5】逗號(hào)運(yùn)算符
public class ForTest {
public static void main(String[] args) {
for(int? i = 1, ?j = i + 10;?? i < 5;? i++, j = i * 2) {
System.out.println("i= " + i + " j= " + j);
}
}
}
示例5運(yùn)行效果圖
無(wú)論在初始化還是在步進(jìn)部分棠赛,語(yǔ)句都是順序執(zhí)行的。
盡管初始化部分可設(shè)置任意數(shù)量的定義,但都屬于同一類型睛约。
約定:只在for語(yǔ)句的控制表達(dá)式中寫(xiě)入進(jìn)行初始化鼎俘,測(cè)試和修改同一計(jì)數(shù)器變量的表達(dá)式。
初始化部分痰腮、條件判斷部分和迭代因子可以為空語(yǔ)句而芥,但以“;”分開(kāi),如示例6所示膀值。
【示例6】無(wú)限循環(huán)
public class ForTest {
public static void main(String[] args) {
for ( ; ; ) {??? //無(wú)限循環(huán)while(true)
System.out.println("北京");
}
}
}
編譯器將while(true)與for(;;)看作同一回事,都指的是無(wú)限循環(huán)误辑。
在for語(yǔ)句的初始化部分聲明的變量沧踏,其作用域?yàn)檎麄€(gè)for循環(huán)體,如示例7所示巾钉。
【示例7】初始化變量的作用域
public class ForTest {
public static void main(String[] args) {
for(int i = 1; i < 10; i++) {
System.out.println(i+"翘狱、");
}// i no longer defined here
System.out.println(i);
}
}
示例7運(yùn)行效果圖
嵌套循環(huán)
在一個(gè)循環(huán)語(yǔ)句內(nèi)部再嵌套一循環(huán)或多個(gè)循環(huán),稱為嵌套循環(huán)砰苍。while潦匈、do-while與for循環(huán)可以任意嵌套多層。
【示例8】嵌套循環(huán)
public class LoopForTest {
public static void main(String args[]) {
for (int i=1; i <=5; i++) {
for(int j=1; j<=5; j++){
System.out.print(i+"? ");
}
System.out.println();
}
}
}
示例8運(yùn)行效果圖
【示例9】使用嵌套循環(huán)實(shí)現(xiàn)九九乘法表
public class LoopForTest {
public static void main(String args[]) {
for (int i = 1; i < 10; i++) {? //i是一個(gè)乘數(shù)
for (int j = 1; j <= i; j++) {? //j是另一個(gè)乘數(shù)
System.out.print(j + "*" + i + "=" + (i * j < 10? (" " + i * j):i * j) + "? ");
}
System.out.println();
}
}
}
示例9運(yùn)行效果圖
break語(yǔ)句和continue語(yǔ)句
在任何循環(huán)語(yǔ)句的主體部分赚导,均可用break控制循環(huán)的流程茬缩。break用于強(qiáng)行退出循環(huán),不執(zhí)行循環(huán)中剩余的語(yǔ)句吼旧。
【示例10】break語(yǔ)句
public class BreakTest {
public static void main(String[] args) {
int total = 0;
System.out.println("Begin");
while(true) {
total++;
int i = (int)Math.round(100 * Math.random());
if(i == 88) break;
}
System.out.println("Game over, used " + total + " times.");
}
}
示例10?運(yùn)行效果圖
continue語(yǔ)句用在循環(huán)語(yǔ)句體中凰锡,用于終止某次循環(huán)過(guò)程,即跳過(guò)循環(huán)體中尚未執(zhí)行的語(yǔ)句圈暗,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定掂为。
注意事項(xiàng)
·continue用在while,do-while中,continue語(yǔ)句立刻跳到循環(huán)首部员串,越過(guò)了當(dāng)前循環(huán)的其余部分勇哗。
·continue用在for循環(huán)中,跳到for循環(huán)的迭代因子部分。
【示例11】把100~150之間不能被3整除的數(shù)輸出
public class ContinueTest {
public static void main(String[] args) {
int count=0;
for (int i = 100; i < 150; i++) {
if (i % 3 == 0)
continue;
count++;
System.out.print(i+"寸齐、");
if(count%5==0){
System.out.println();
}
}
}
}
示例11運(yùn)行效果圖
帶標(biāo)簽的break和continue
goto關(guān)鍵字很早就在程序設(shè)計(jì)語(yǔ)言中出現(xiàn)欲诺。盡管goto仍是Java的一個(gè)保留字,但并未在語(yǔ)言中得到正式使用访忿;Java沒(méi)有g(shù)oto瞧栗。然而,在break和continue這兩個(gè)關(guān)鍵字的身上海铆,我們?nèi)匀荒芸闯鲆恍ゞoto的影子---帶標(biāo)簽的break和continue迹恐。
“標(biāo)簽”是指后面跟一個(gè)冒號(hào)的標(biāo)識(shí)符,例如:“l(fā)abel:”卧斟。對(duì)Java來(lái)說(shuō)唯一用到標(biāo)簽的地方是在循環(huán)語(yǔ)句之前殴边。而在循環(huán)之前設(shè)置標(biāo)簽的唯一理由是:我們希望在其中嵌套另一個(gè)循環(huán)憎茂,由于break和continue關(guān)鍵字通常只中斷當(dāng)前循環(huán),但若隨同標(biāo)簽使用锤岸,它們就會(huì)中斷到存在標(biāo)簽的地方竖幔。
在“Goto有害”論中,最有問(wèn)題的就是標(biāo)簽是偷,而非goto拳氢,隨著標(biāo)簽在一個(gè)程序里數(shù)量的增多,產(chǎn)生錯(cuò)誤的機(jī)會(huì)也越來(lái)越多蛋铆。但馋评,Java標(biāo)簽不會(huì)造成這方面的問(wèn)題,因?yàn)樗鼈兊幕顒?dòng)場(chǎng)所已被限死刺啦,不可通過(guò)特別的方式到處傳遞程序的控制權(quán)留特。由此也引出了一個(gè)有趣的問(wèn)題:通過(guò)限制語(yǔ)句的能力,反而能使一項(xiàng)語(yǔ)言特性更加有用玛瘸。
【示例12】帶標(biāo)簽break和continue控制嵌套循環(huán)跳轉(zhuǎn)(打印101-150之間所有的質(zhì)數(shù))
public class PrimeNumber {
public static void main(String args[]) {
intcount = 0;
outer:for(inti = 101; i < 150; i ++) {
for(intj = 2; j < i / 2; j++) {
if(i % j == 0)
continueouter;
}
System.out.print(i+"? ");
}
}
}
「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記蜕青。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗(yàn)糊渊,曾在神州數(shù)碼右核、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師再来、高級(jí)工程師蒙兰、架構(gòu)師。精通Java平臺(tái)軟件開(kāi)發(fā)芒篷,精通JAVAEE搜变,熟悉各種流行開(kāi)發(fā)框架。
筆記包含從淺入深的六大部分:
A-Java入門(mén)階段
B-數(shù)據(jù)庫(kù)從入門(mén)到精通
C-手刃移動(dòng)前端和Web前端
D-J2EE從了解到實(shí)戰(zhàn)
E-Java高級(jí)框架精解
F-Linux和Hadoop
F-Linux和Hadoop