流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。控制语句分为三类:顺序、选择和循环。

  • “顺序结构”代表“先执行a,再执行b”的逻辑。
  • “选择结构”代表“如果…,则…”的逻辑。
  • “循环结构”代表“如果…,则再继续…”的逻辑。

    选择结构

    选择结构用于判断给定的条件,然后根据判断的结果来控制程序的流程。
    主要的选择结构有如下结构:

    if单选择结构

    1. if(布尔表达式){
    2. 语句块
    3. }

    if-else双选择结构

    1. if(布尔表达式){
    2. 语句块1
    3. }else{
    4. 语句块2
    5. }
    6. // 两种表达式效果一致
    7. 布尔表达式?true:false;

    if-else if-else多选择结构

    ```java // 逐级往下判断,直至条件为真。 if(布尔表达式1) { 语句块1; } else if(布尔表达式2) { 语句块2; }else if(布尔表达式n){ 语句块n; } else { 语句块n+1; }
  1. <a name="NyIlN"></a>
  2. ### switch结构
  3. switch语句会根据表达式的值从相匹配的case标签处开始执行,一直执行到break语句处或者是switch语句的末尾。如果表达式的值与任一case值不匹配,则进入default语句(如果存在default语句的情况)。
  4. ```java
  5. switch (表达式) {
  6. case 值1:
  7. 语句序列1;
  8. [break];
  9. case 值2:
  10. 语句序列2;
  11. [break];
  12. [default:
  13. 默认语句;]
  14. }

循环结构

while循环

在循环刚开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体。而对于后来每一次额外的循环,都会在开始前重新计算一次。

  1. while (布尔表达式) {
  2. 循环体;
  3. }

do-while循环

do-while循环结构会先执行循环体,然后再判断布尔表达式的值,若条件为真,执行循环体,当条件为假时结束循环。do-while循环的循环体至少执行一次。

  1. do {
  2. 循环体;
  3. } while(布尔表达式) ;

for循环

for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。for循环在第一次反复之前要进行初始化,即执行初始表达式;随后,对布尔表达式进行判定,若判定结果为true,则执行循环体,否则,终止循环;最后在每一次反复的时候,进行某种形式的“步进”,即执行迭代因子。
A. 初始化部分设置循环变量的初值
B. 条件判断部分为任意布尔表达式
C. 迭代因子控制循环变量的增减
for循环在执行条件判定后,先执行的循环体部分,再执行步进。

  1. for (初始表达式; 布尔表达式; 迭代因子) {
  2. 循环体;
  3. }

foreach循环

更加简洁的for语法格式,可以用于遍历数组和集合

  1. for(元素类型 元素变量x:遍历对象(数组或集合)){
  2. 引用元素变量x的语句;
  3. }

break语句

在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。

continue语句

continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
注意事项
1. continue用在while,do-while中,continue 语句立刻跳到循环首部,越过了当前循环的其余部分。
2. continue用在for循环中,跳到for循环的迭代因子部分。

递归结构

递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。
递归结构包括两个部分:
1.定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件。
2.递归体。解答:什么时候需要调用自身方法。

  1. public class Test22 {
  2. public static void main(String[] args) {
  3. long d1 = System.currentTimeMillis();
  4. System.out.printf("%d阶乘的结果:%s%n", 10, factorial(10));
  5. long d2 = System.currentTimeMillis();
  6. System.out.printf("递归费时:%s%n", d2-d1); //耗时:32ms
  7. }
  8. /** 求阶乘的方法*/
  9. static long factorial(int n){
  10. if(n==1){//递归头
  11. return 1;
  12. }else{//递归体
  13. return n*factorial(n-1);//n! = n * (n-1)!
  14. }
  15. }
  16. }