Java流程控制
這一篇我想談一談Java中學(xué)過(guò)的基礎(chǔ)語(yǔ)法艘狭。從大一入學(xué)開(kāi)始學(xué)C菇绵、C++篮绰,到現(xiàn)在大三下期后雷,學(xué)了很多東西,但記憶最深刻的還是那個(gè)for循環(huán)的99乘法表吠各、一開(kāi)始接觸 cin 和 cout 的新鮮感覺(jué)。
還有在ACM校隊(duì)里天天腦子撓破寫(xiě)題的日子勉抓,好多算法我現(xiàn)在都忘了怎么寫(xiě)了贾漏,那可真是青春嗷。但青春一去就不復(fù)返了呀藕筋!
言歸正傳~
用戶交互的Scanner方法
在基本語(yǔ)法中纵散,要實(shí)現(xiàn)程序和人的交互,需要用到Java給我們提供的工具類來(lái)獲取用戶的輸入隐圾。這個(gè)包是從Java5開(kāi)始引入的伍掀。
package java.util.Scanner
//基本語(yǔ)法
Scanner s = new Scanner(System.in);
String str = scanner.netLine();
System.out.println(str);
scanner.close();
如果是通過(guò)Scanner類的next()和nextLine()方法獲取輸入的字符串,在它讀取之前暇藏,我們需要使用hasNext()和hasNextLine()判斷是否還有輸入的數(shù)據(jù)蜜笤。
屬于IO流的類如果不關(guān)閉會(huì)一直占用資源,要養(yǎng)成好習(xí)慣用完就關(guān)盐碱。
順序結(jié)構(gòu)
Java的基本結(jié)構(gòu)就是順序結(jié)構(gòu)把兔,即按照順序一句一句的向下執(zhí)行。它是最簡(jiǎn)單的算法結(jié)構(gòu)
在語(yǔ)句和語(yǔ)句之間瓮顽,框與框之間是按從上到下都順序進(jìn)行的县好,它是由若干個(gè)依次執(zhí)行的處理步驟組成的,甚至可以說(shuō)暖混,順序結(jié)構(gòu)是任何一種算法都離不開(kāi)的基本算法結(jié)構(gòu)缕贡。
選擇結(jié)構(gòu)
-
if單選擇結(jié)構(gòu)
在場(chǎng)景中,我們需要判斷一個(gè)東西是否可行,然后我們?cè)偃?zhí)行語(yǔ)句晾咪,這樣的一個(gè)過(guò)程在編程中用if語(yǔ)句來(lái)表示黔漂。
if(布爾表達(dá)式){ //語(yǔ)句 }
-
if雙選擇結(jié)構(gòu)
需要用到兩個(gè)判斷語(yǔ)句,所以就引入了雙選擇結(jié)構(gòu)禀酱,所以就有了if-else結(jié)構(gòu)炬守,又稱為if雙選擇結(jié)構(gòu)。
if(布爾表達(dá)式){ //為true時(shí)執(zhí)行該語(yǔ)句 }else{ //為false時(shí)執(zhí)行該語(yǔ)句 }
-
if多選擇結(jié)構(gòu)
當(dāng)存在區(qū)間多級(jí)判斷時(shí)剂跟,需要一個(gè)多選擇結(jié)構(gòu)來(lái)處理這類問(wèn)題减途,即if-else if結(jié)構(gòu)。
if(表達(dá)式a){ //a為真執(zhí)行該語(yǔ)句 }else if(表達(dá)式b){ //b為真執(zhí)行該語(yǔ)句 }else if(表達(dá)式c){ //c為真執(zhí)行該語(yǔ)句 }else { //a曹洽、b鳍置、c都為假則執(zhí)行該語(yǔ)句 }
在該結(jié)構(gòu)中,至多有1個(gè)else語(yǔ)句送淆,必須在所有的else if語(yǔ)句之后税产;
如果有一個(gè)else if 語(yǔ)句為true,其他的else if以及else語(yǔ)句直接跳過(guò)執(zhí)行偷崩。
-
嵌套的if結(jié)構(gòu)
在if語(yǔ)句中嵌套使用另一個(gè)if或者else if 語(yǔ)句辟拷,這樣是合法的。
if(語(yǔ)句a){ //如果a為ture執(zhí)行代碼 if(語(yǔ)句b){ //如果b為true執(zhí)行代碼 } }
-
switch 多選擇結(jié)構(gòu)
除了if-else if 之外阐斜,還有一個(gè)多選擇結(jié)構(gòu)實(shí)現(xiàn)方式衫冻,即switch case語(yǔ)句。
用于判斷一個(gè)變量與一系列值中某個(gè)值是否匹配谒出,每個(gè)值稱為一個(gè)分支隅俘。
switch語(yǔ)句中的變量類型可以是byte short int 或者 char;從JavaSE 7開(kāi)始笤喳,switch變量也支持了String類型为居,同時(shí)case標(biāo)簽必須為字符串常亮或者字面量。并且可以有任意數(shù)量的case標(biāo)簽 杀狡。
如果對(duì)class文件進(jìn)行反編譯蒙畴,那么就會(huì)看到switch語(yǔ)句進(jìn)行匹配的是字符串變量的hashCode,比如:
//Java代碼 String name = "barnes"; switch(name){ case"": sout; break; case"": sout; break; default: sout; } //class文件經(jīng)過(guò)idea反編譯后的代碼 //String name = "barnes"; //byte var3 = -1; //switch(name.hashCode()){ // case (hashCode): // if (name.equals("xx")){ // var3 = 1; // } // break; //}
然后對(duì)生成的var3進(jìn)行switch判斷再輸出數(shù)據(jù)
switch(expression){ case 1: //代碼 break;//可選 不加break可能造成case穿透捣卤,即從滿足條件的語(yǔ)句一路執(zhí)行到底部 case 2: //代碼 break; case 3: //代碼 break; default: //都不滿足時(shí) }
循環(huán)結(jié)構(gòu)
-
while循環(huán)
while(布爾表達(dá)式){ //循環(huán)內(nèi)容 }
只要表達(dá)式值為true忍抽,循環(huán)就會(huì)一直執(zhí)行下去。同時(shí)董朝,如果不符合條件則不能進(jìn)入循環(huán)鸠项,直接跳過(guò)。
極少情況下需要循環(huán)一直執(zhí)行子姜,比如服務(wù)器的請(qǐng)求響應(yīng)監(jiān)聽(tīng)祟绊;其他時(shí)候都應(yīng)該有一個(gè)讓表達(dá)式失效的方式來(lái)結(jié)束循環(huán)楼入,在正常的編程過(guò)程中,應(yīng)該盡量避免死循環(huán)牧抽,而引起反應(yīng)慢嘉熊,或者崩潰。
-
do-while循環(huán)
do{ //代碼語(yǔ)句 }while(布爾表達(dá)式)
和while循環(huán)用法相同扬舒,但有時(shí)候需要至少執(zhí)行一次阐肤,就需要用到do-while循環(huán)。
while先判斷再執(zhí)行讲坎;do-while是先執(zhí)行后判斷孕惜,所以它的循環(huán)體至少會(huì)執(zhí)行一次,這是這兩個(gè)循環(huán)的主要差別
-
for循環(huán)
在c++里第一個(gè)接觸到的就是for循環(huán)晨炕,所以這一塊還是挺好理解的衫画。
for(初始化;布爾表達(dá)式瓮栗;更新){ //代碼語(yǔ)句 }
for循環(huán)可以讓循環(huán)結(jié)構(gòu)變得更加簡(jiǎn)單削罩,它是支持迭代的一種結(jié)構(gòu),可以說(shuō)是最有效费奸,最靈活的循環(huán)結(jié)構(gòu)弥激。同時(shí)在執(zhí)行前就確定了該循環(huán)執(zhí)行的次數(shù)。
一個(gè)IDEA小技巧
// 100.for // →for(int i = 0; i < 100; i++){ // //}
經(jīng)典九九乘法表
-
增強(qiáng)for循環(huán)
在Java5中货邓,新引入了一種用于數(shù)據(jù)或者集合的增強(qiáng)型for循環(huán)秆撮。
for(聲明語(yǔ)句:表達(dá)式){ //代碼塊 } //聲明語(yǔ)句是聲明新的局部變量,這個(gè)變量的類型要和循環(huán)數(shù)組元素的類型相匹配换况。把作用域限制在循環(huán)體中。 //表達(dá)式應(yīng)該為數(shù)組名或者返回值為數(shù)組的一個(gè)方法名盗蟆。
學(xué)數(shù)據(jù)結(jié)構(gòu)的時(shí)候講到過(guò)戈二,但確實(shí)沒(méi)怎么用過(guò)這個(gè)方法。好快速喳资!每天復(fù)習(xí)都能重新?lián)煲稽c(diǎn)新東西觉吭,當(dāng)然從側(cè)面印證了基礎(chǔ)不牢啊。
例子:
int[] num = {10,20,30,40,50};//定義數(shù)組 for(int x:num){ System.out.println(x); }
break&continue
break在所有循環(huán)語(yǔ)句的循環(huán)體中仆邓,都可以用break來(lái)中斷循環(huán)流程鲜滩。需要強(qiáng)行退出循環(huán),不執(zhí)行剩下語(yǔ)句時(shí)节值,就可以加一個(gè)break
continue的作用是中止循環(huán)過(guò)程徙硅,但進(jìn)行下一次是否執(zhí)行循環(huán)的判斷。它和break有一點(diǎn)像搞疗,但還要進(jìn)行下一次循環(huán)是最大的差別嗓蘑。
goto這個(gè)東西呢,大一的時(shí)候?qū)W長(zhǎng)對(duì)它鄙夷至極,說(shuō)它經(jīng)常出問(wèn)題桩皿,最好別用豌汇;goto雖然是Java的一個(gè)保留關(guān)鍵字,但現(xiàn)在在Java中是沒(méi)有g(shù)oto語(yǔ)句的泄隔,而我們從break和continue是可以看出goto殘留的一些特征的拒贱。
可以用break和continue加標(biāo)簽實(shí)現(xiàn)goto功能,但實(shí)際上沒(méi)啥用處佛嬉。
一個(gè)輸出101-150質(zhì)數(shù)的代碼逻澳,可以看到通過(guò)continue outer語(yǔ)句從內(nèi)部循環(huán)直接跳到外部循環(huán)(最好不要使用)