本文源碼:GitHub·點這裏 || GitEE·點這裏java
1、分支語句
流程控制語句對任何一門編程語言都是很是重要的,Java中基於流程控制程序執行的不一樣步驟和代碼塊。git
一、IF條件
IF條件語句會根據不一樣的判斷條件執行不一樣的語句,if後括號內的條件是否成立關鍵步驟,IF條件的判斷結果必然要是true或false。IF...Else語句則是知足IF條件,就執行相應代碼塊,不然就執行Elase代碼塊。github
public class Process01 { public static void main(String[] args) { // 演示:Node01 if (compare01(40,30)){ System.out.println("40>30:true"); } else { System.out.println("40>30:false"); } // 演示:Node02 if (compare01(10,20) && compare01(20,30)){ System.out.println("條件成立"); } else { System.out.println("條件不成立"); } // 演示:Node03 if (compare01(20,10) || compare01(20,30)){ System.out.println("條件成立"); } else { System.out.println("條件不成立"); } // 演示:Node04 if(compare02(1,1)) if(compare02(2,2)) System.out.println("Running..."); // 演示:Node05 if(compare01(1,2)) if(compare01(5,3)){ System.out.println("5>3"); } } private static boolean compare01 (int num1,int num2){ System.out.println("判斷:num1="+num1+";num2="+num2); return num1 > num2 ; } private static boolean compare02 (int num1,int num2){ System.out.println("判斷:num1="+num1+";num2="+num2); return num1 == num2 ; } }
節點案例,測試結果描述:面試
- Node01:若是if條件不成立,則執行else流程或者結束;
- Node02:邏輯且判斷,任何條件不成立,則直接結束;
- Node03:邏輯或判斷,任何條件成立,則直接進入分支;
- Node04:IF的格式,能夠去掉{},後續語句會做爲分支;
- Node05:IF語句面試題,不會輸出任何內容,第二個語句做爲分支;
注意:在流程控制語句中必須使用大括號,即便只有一行代碼,避免採用單行的編碼方式,這是基礎規範。在上面的測試節點4和5,代碼看着就感受扎心。算法
二、IF-Else-IF條件
Else...IF分支語句用於多種狀況進行的判斷處理,直到分支判斷條件成功,執行分支模塊代碼,若是沒有else條件,能夠全部分支都不知足,直接結束。編程
public class Process02 { public static void main(String[] args) { elseIf(11) ; elseIf(9) ; elseIf(5); } private static void elseIf (Integer num){ if (num > 10){ System.out.println("num > 10"); } else if (num > 7){ System.out.println("num > 7"); } else if (num > 4){ System.out.println("num > 4"); } else { System.out.println("num < 4"); } } }
注意:根據條件逐個判斷,直到找到第一個知足的條件,不會再繼續往下面的判斷執行,分支語句執行完畢就會退出當前的else...if流程。超過3層的的邏輯判斷代碼可使用衛語句、策略模式、狀態模式等來實現。多線程
三、Switch條件
流程描述:switch語句先獲取表達式的值,判斷表達式的值與case語句後的常量值是否相同,匹配成功則執行該case後的代碼塊,直到遇到break語句後終止,若是缺失break打斷,則繼續匹配下一case常量,直到遇到break爲止。若是條件全不匹配,則執行default後面的語句。default語句可選,若是不存在default語句,同一個switch語句,case的常量值必須互不相同。併發
public class Process03 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("What day is it today:"); String value = scan.next(); weekInfo(value); } private static void weekInfo (String value){ switch (value) { case "Monday": System.out.println("Monday"); break; case "Tuesday": System.out.println("Tuesday"); break; case "Wednesday": System.out.println("Wednesday"); break; case "Thursday": System.out.println("Thursday"); break; case "Friday": System.out.println("Friday"); break; case "Saturday": System.out.println("Saturday"); break; case "Sunday": System.out.println("Sunday"); break; default: System.out.println("Matching failure"); break; } } }
注意:從JDK1.7以後,switch支持對String字符串的匹配。編程語言
2、循環語句
循環語句就是在知足特定條件的狀況下,反覆執行同個操做。循環語句包括:for循環、while循環、do···while循環。測試
一、For循環
Java開發中最有用的循環方式,也是諸多算法中的基礎控制語句,在常見的不少算法編碼實現中,都須要藉助for循環方式。
public class Process04 { public static void main(String[] args) { // Node01 int sum = 0; for(int i=1; i<=100; i++) { sum += i; } System.out.println(sum); // Node02 String[] nameArr = {"Java","C++","C#"} ; for (String name:nameArr){ System.out.println("name="+name); } // Node03 // 輸出 i = 13 int i = 0; for (i++; i++ < 10; i++); System.out.println(++i); // 輸出:j=3 6 9 int j = 0; for (j++; j++ < 10; j++){ System.out.println(++j); } } }
節點案例,測試結果描述:
- Node01:for循環做爲計算中的經常使用方式;
- Node02:foreach遍歷模式,簡化循環操做,也能夠改寫爲for語句;
- Node03:循環for語句的基礎執行機制,兩道面試常見題;
注意:越是基礎的東西,學起來越難,for語句做爲不少算法實現的基礎控制,理解起來至關的繞。
二、While循環
while循環語句首先判斷條件是否成立,成立才執行循環體;
do···while循環語句先執行一次循環體,而後判斷條件是否成立,因此do···while至少會執行一次;
public class Process05 { public static void main(String[] args) { int num1 = 1; int num2 = 1; // while循環 while(num1 <= 3) { System.out.println("num1 == " + num1); num1++; } // do...while循環 do { System.out.println("num2 == " + num2); num2++; } while(num2 <= 3); } }
注意:while循環在實際的開發中,由於極其容易致使死循環,因此使用並很少。
3、流程中斷
Java中有三種流程中斷語句,關鍵字分別爲break、continue、return語句。
一、Return語句
Java中最經常使用的流程控制關鍵字,當執行return語句後,從該方法返回,返回到調用該方法的業務流程中。
public class Process06 { public static void main(String[] args) { System.out.println(getNum1()); System.out.println(getNum2()); } public static int getNum1 (){ int a =100; try{ return a+1; // 這裏是運算邏輯,非賦值 }catch(Exception e){ e.printStackTrace(); }finally{ return a; } } public static int getNum2 (){ int a =100; try{ return a++; // a++ -> a=a+1 此時a的值改變 }catch(Exception e){ e.printStackTrace(); }finally{ return a; } } }
return 常在位置
- return語句只在方法最後出現一次。
- return語句僅在try和catch裏面都出現。
- return語句僅在try和方法最後都出現。
- return語句僅在catch和方法的最後都出現。
二、Break語句
break中斷語句經常使用在for、while、do···while循環中,用於退出當前整個循環流程,非當前這一次循環。
public class Process07 { public static void main(String[] args) { for (int i = 1 ; i < 3 ; i++){ if (i == 2){ break ; } System.out.println("i = " + i); } } }
三、Continue語句
Continue中斷語句經常使用在for、while、do···while循環中,用於退出當前這一次循環,進入下一次循環。
public class Process08 { public static void main(String[] args) { for (int i = 1 ; i < 3 ; i++){ if (i == 1){ continue ; } System.out.println("i = " + i); } } }
4、應用場景
一、冒泡排序算法
public class Process09 { public static void main(String[] args) { int[] score = {9,8,7,6,5} ; // 排序次數:最多 length - 1 次 for (int i = 0 ; i < score.length -1 ; i ++){ // 當前排序的集合區間,排序完一個數據就放棄一個 for (int j = 0 ; j < score.length - i - 1 ; j++){ // 冒泡排序:把結果大的向後扔 if (score[j] > score[j+1]){ int temp = score[j] ; score[j] = score[j+1] ; score[j+1] = temp ; } } } // 輸出排序後的結果集 for (int i = 0 ; i < score.length ; i++){ System.out.print(score[i]); } } }
二、排列組合算法
有一、二、三、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?
public class Process10 { public static void main(String[] args) { arrange() ; } public static void arrange (){ int i=0; // 百位數 int j=0; // 十位數 int k=0; // 個位數 int t=0; // 計數器 for (i = 1 ; i <= 4 ; i++){ for (j = 1 ; j <= 4 ; j++){ for (k = 1 ; k <=4 ; k++){ if (i != j && j != k && k != i){ t += 1 ; System.out.print(i*100+j*10+k+"--"); } } } } System.out.println(); System.out.println("t="+t); } }
三、遞歸常見算法
基於遞歸思想的各類計算方法實現。
public class Process11 { public static void main(String[] args) { System.out.println(getSumOne(100)); System.out.println(getSumTwo(30)); System.out.println(getSumThree(5)); } /** * 使用遞歸的方式計算1+2+...+100 */ public static int getSumOne (int i){ // 傳入100 int sum ; if (i == 1){ return 1 ; } else { sum = i + getSumOne(i - 1) ; } return sum ; } /** * 一列數的規則以下: 一、一、二、三、五、八、1三、2一、34... * 求第30位數是多少, 用遞歸算法實現 */ public static int getSumTwo (int i){ // 傳入第幾位數下標 if (i <= 0){ return 0 ; } else if (i == 1 || i == 2){ // 處理前面2位的1,1 return 1 ; } else { // 當前位數是前兩位之和 return getSumTwo(i - 1) + getSumTwo(i - 2) ; } } /** * 1*2*3*...*100 遞歸計算階乘 */ public static int getSumThree (int i){ if (i == 1){ return i ; } else { return i * getSumThree (i - 1) ; } } }
5、源代碼地址
GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent
推薦閱讀:Java基礎系列