從零開(kāi)始復(fù)習(xí)Java-流程控制

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)

image-20200612141639447

在語(yǔ)句和語(yǔ)句之間瓮顽,框與框之間是按從上到下都順序進(jìn)行的县好,它是由若干個(gè)依次執(zhí)行的處理步驟組成的,甚至可以說(shuō)暖混,順序結(jié)構(gòu)是任何一種算法都離不開(kāi)的基本算法結(jié)構(gòu)缕贡。

選擇結(jié)構(gòu)

  1. if單選擇結(jié)構(gòu)

    在場(chǎng)景中,我們需要判斷一個(gè)東西是否可行,然后我們?cè)偃?zhí)行語(yǔ)句晾咪,這樣的一個(gè)過(guò)程在編程中用if語(yǔ)句來(lái)表示黔漂。

    image-20200612144947056
    if(布爾表達(dá)式){
        //語(yǔ)句
    }
    
  2. if雙選擇結(jié)構(gòu)

    需要用到兩個(gè)判斷語(yǔ)句,所以就引入了雙選擇結(jié)構(gòu)禀酱,所以就有了if-else結(jié)構(gòu)炬守,又稱為if雙選擇結(jié)構(gòu)。

    image-20200612155712187
    if(布爾表達(dá)式){
        //為true時(shí)執(zhí)行該語(yǔ)句
    }else{
        //為false時(shí)執(zhí)行該語(yǔ)句
    }
    
  1. if多選擇結(jié)構(gòu)

    當(dāng)存在區(qū)間多級(jí)判斷時(shí)剂跟,需要一個(gè)多選擇結(jié)構(gòu)來(lái)處理這類問(wèn)題减途,即if-else if結(jié)構(gòu)。

    image-20200612162641997
    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í)行偷崩。

  2. 嵌套的if結(jié)構(gòu)

    在if語(yǔ)句中嵌套使用另一個(gè)if或者else if 語(yǔ)句辟拷,這樣是合法的。

    if(語(yǔ)句a){
        //如果a為ture執(zhí)行代碼
        if(語(yǔ)句b){
            //如果b為true執(zhí)行代碼
        }
    }
    
  1. 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)

  1. 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)慢嘉熊,或者崩潰。

  2. 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)的主要差別

  3. 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)典九九乘法表

    image-20200613174534659
  1. 增強(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);
    }
    
    image-20200613180005426

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)(最好不要使用)

image-20200613195256632
image-20200613195330591
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巷燥,隨后出現(xiàn)的幾起案子赡盘,更是在濱河造成了極大的恐慌,老刑警劉巖缰揪,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陨享,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡钝腺,警方通過(guò)查閱死者的電腦和手機(jī)抛姑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)艳狐,“玉大人定硝,你說(shuō)我怎么就攤上這事『聊浚” “怎么了蔬啡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)镀虐。 經(jīng)常有香客問(wèn)我箱蟆,道長(zhǎng),這世上最難降的妖魔是什么刮便? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任空猜,我火速辦了婚禮,結(jié)果婚禮上恨旱,老公的妹妹穿的比我還像新娘辈毯。我一直安慰自己,他們只是感情好搜贤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布谆沃。 她就那樣靜靜地躺著,像睡著了一般入客。 火紅的嫁衣襯著肌膚如雪管毙。 梳的紋絲不亂的頭發(fā)上腿椎,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音夭咬,去河邊找鬼啃炸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卓舵,可吹牛的內(nèi)容都是我干的南用。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掏湾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裹虫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起融击,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤筑公,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后尊浪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匣屡,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年拇涤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捣作。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出池户,到底是詐尸還是另有隱情,我是刑警寧澤普气,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搪泳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一扼脐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奋刽,春花似錦瓦侮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至狭魂,卻和暖如春罚攀,著一層夾襖步出監(jiān)牢的瞬間党觅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工斋泄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杯瞻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓炫掐,卻偏偏與公主長(zhǎng)得像魁莉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子募胃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348