Java流程控制
這一篇我想談一談Java中學過的基礎語法。從大一入學開始學C、C++,到現(xiàn)在大三下期,學了很多東西,但記憶最深刻的還是那個for循環(huán)的99乘法表、一開始接觸 cin 和 cout 的新鮮感覺。
還有在ACM校隊里天天腦子撓破寫題的日子,好多算法我現(xiàn)在都忘了怎么寫了,那可真是青春嗷。但青春一去就不復返了呀!
言歸正傳~
用戶交互的Scanner方法
在基本語法中,要實現(xiàn)程序和人的交互,需要用到Java給我們提供的工具類來獲取用戶的輸入。這個包是從Java5開始引入的。
package java.util.Scanner
//基本語法
Scanner s = new Scanner(System.in);
String str = scanner.netLine();
System.out.println(str);
scanner.close();
如果是通過Scanner類的next()和nextLine()方法獲取輸入的字符串,在它讀取之前,我們需要使用hasNext()和hasNextLine()判斷是否還有輸入的數(shù)據(jù)。
屬于IO流的類如果不關閉會一直占用資源,要養(yǎng)成好習慣用完就關。
順序結(jié)構(gòu)
Java的基本結(jié)構(gòu)就是順序結(jié)構(gòu),即按照順序一句一句的向下執(zhí)行。它是最簡單的算法結(jié)構(gòu)

在語句和語句之間,框與框之間是按從上到下都順序進行的,它是由若干個依次執(zhí)行的處理步驟組成的,甚至可以說,順序結(jié)構(gòu)是任何一種算法都離不開的基本算法結(jié)構(gòu)。
選擇結(jié)構(gòu)
-
if單選擇結(jié)構(gòu)
在場景中,我們需要判斷一個東西是否可行,然后我們再去執(zhí)行語句,這樣的一個過程在編程中用if語句來表示。
image-20200612144947056if(布爾表達式){ //語句 } -
if雙選擇結(jié)構(gòu)
需要用到兩個判斷語句,所以就引入了雙選擇結(jié)構(gòu),所以就有了if-else結(jié)構(gòu),又稱為if雙選擇結(jié)構(gòu)。
image-20200612155712187if(布爾表達式){ //為true時執(zhí)行該語句 }else{ //為false時執(zhí)行該語句 }
-
if多選擇結(jié)構(gòu)
當存在區(qū)間多級判斷時,需要一個多選擇結(jié)構(gòu)來處理這類問題,即if-else if結(jié)構(gòu)。
image-20200612162641997if(表達式a){ //a為真執(zhí)行該語句 }else if(表達式b){ //b為真執(zhí)行該語句 }else if(表達式c){ //c為真執(zhí)行該語句 }else { //a、b、c都為假則執(zhí)行該語句 }在該結(jié)構(gòu)中,至多有1個else語句,必須在所有的else if語句之后;
如果有一個else if 語句為true,其他的else if以及else語句直接跳過執(zhí)行。
-
嵌套的if結(jié)構(gòu)
在if語句中嵌套使用另一個if或者else if 語句,這樣是合法的。
if(語句a){ //如果a為ture執(zhí)行代碼 if(語句b){ //如果b為true執(zhí)行代碼 } }
-
switch 多選擇結(jié)構(gòu)
除了if-else if 之外,還有一個多選擇結(jié)構(gòu)實現(xiàn)方式,即switch case語句。
用于判斷一個變量與一系列值中某個值是否匹配,每個值稱為一個分支。
switch語句中的變量類型可以是byte short int 或者 char;從JavaSE 7開始,switch變量也支持了String類型,同時case標簽必須為字符串常亮或者字面量。并且可以有任意數(shù)量的case標簽 。
如果對class文件進行反編譯,那么就會看到switch語句進行匹配的是字符串變量的hashCode,比如:
//Java代碼 String name = "barnes"; switch(name){ case"": sout; break; case"": sout; break; default: sout; } //class文件經(jīng)過idea反編譯后的代碼 //String name = "barnes"; //byte var3 = -1; //switch(name.hashCode()){ // case (hashCode): // if (name.equals("xx")){ // var3 = 1; // } // break; //}然后對生成的var3進行switch判斷再輸出數(shù)據(jù)
switch(expression){ case 1: //代碼 break;//可選 不加break可能造成case穿透,即從滿足條件的語句一路執(zhí)行到底部 case 2: //代碼 break; case 3: //代碼 break; default: //都不滿足時 }
循環(huán)結(jié)構(gòu)
-
while循環(huán)
while(布爾表達式){ //循環(huán)內(nèi)容 }只要表達式值為true,循環(huán)就會一直執(zhí)行下去。同時,如果不符合條件則不能進入循環(huán),直接跳過。
極少情況下需要循環(huán)一直執(zhí)行,比如服務器的請求響應監(jiān)聽;其他時候都應該有一個讓表達式失效的方式來結(jié)束循環(huán),在正常的編程過程中,應該盡量避免死循環(huán),而引起反應慢,或者崩潰。
-
do-while循環(huán)
do{ //代碼語句 }while(布爾表達式)和while循環(huán)用法相同,但有時候需要至少執(zhí)行一次,就需要用到do-while循環(huán)。
while先判斷再執(zhí)行;do-while是先執(zhí)行后判斷,所以它的循環(huán)體至少會執(zhí)行一次,這是這兩個循環(huán)的主要差別
-
for循環(huán)
在c++里第一個接觸到的就是for循環(huán),所以這一塊還是挺好理解的。
for(初始化;布爾表達式;更新){ //代碼語句 }for循環(huán)可以讓循環(huán)結(jié)構(gòu)變得更加簡單,它是支持迭代的一種結(jié)構(gòu),可以說是最有效,最靈活的循環(huán)結(jié)構(gòu)。同時在執(zhí)行前就確定了該循環(huán)執(zhí)行的次數(shù)。
一個IDEA小技巧
// 100.for // →for(int i = 0; i < 100; i++){ // //}經(jīng)典九九乘法表
image-20200613174534659
-
增強for循環(huán)
在Java5中,新引入了一種用于數(shù)據(jù)或者集合的增強型for循環(huán)。
for(聲明語句:表達式){ //代碼塊 } //聲明語句是聲明新的局部變量,這個變量的類型要和循環(huán)數(shù)組元素的類型相匹配。把作用域限制在循環(huán)體中。 //表達式應該為數(shù)組名或者返回值為數(shù)組的一個方法名。學數(shù)據(jù)結(jié)構(gòu)的時候講到過,但確實沒怎么用過這個方法。好快速!每天復習都能重新?lián)煲稽c新東西,當然從側(cè)面印證了基礎不牢啊。
例子:
int[] num = {10,20,30,40,50};//定義數(shù)組 for(int x:num){ System.out.println(x); }image-20200613180005426
break&continue
break在所有循環(huán)語句的循環(huán)體中,都可以用break來中斷循環(huán)流程。需要強行退出循環(huán),不執(zhí)行剩下語句時,就可以加一個break
continue的作用是中止循環(huán)過程,但進行下一次是否執(zhí)行循環(huán)的判斷。它和break有一點像,但還要進行下一次循環(huán)是最大的差別。
goto這個東西呢,大一的時候?qū)W長對它鄙夷至極,說它經(jīng)常出問題,最好別用;goto雖然是Java的一個保留關鍵字,但現(xiàn)在在Java中是沒有g(shù)oto語句的,而我們從break和continue是可以看出goto殘留的一些特征的。
可以用break和continue加標簽實現(xiàn)goto功能,但實際上沒啥用處。
一個輸出101-150質(zhì)數(shù)的代碼,可以看到通過continue outer語句從內(nèi)部循環(huán)直接跳到外部循環(huán)(最好不要使用)






