coding……
但行好事 莫问前程

Java编程拾遗『控制流程』

与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流流程。

1. 条件语句

条件语句就是使用if进行条件判断,及逻辑处理,主要包含以下几种形式。

1.1 if

单if条件语句格式如下:

if (condition) {
	statement;
}

如果布尔表达式condition为真,则执行statement语句。

1.2 if……else

if……else条件语句格式如下:

if (condition) {
	statement1;
} else {
	statement2;
}

如果布尔表达式condition为真,则执行statement语句,否则执行statement语句。

1.3 if……else if……else

if……else if……else条件语句格式如下:

if (condition) {
	statement1;
} else if (condition1) {
	statement2;
} else {
	statement3;
}

如果布尔表达式condition为真,则执行statement1语句,条件语句结束。否则判断condition1是否为真,如果为真则执行statement2语句。如果condition与condition都不为真,则执行statement语句。else if条件可以有多个,一旦从上到下其中一个布尔表达式检测为 true,则执行该布尔表达式的语句,其他的 else if 以及 else 语句都将跳过执行。假如所有的布尔表达式都为false,则最终执行else中的语句

1.4 嵌套的if…else

if语句中可以随意嵌套其它格式的条件语句,但是建议最好不要嵌套太多曾,不然代码可读性会比较差。

if(condition1) {
	statement1;
    if(condition1) {
    	statement2;
   }
}

2. 循环语句

Java中存在一下三种主要的循环结构,for循环结构、while循环结构、do…while循环结构。对于这三种循环结构,熟悉C/C++的人应该很清楚它们的语义。循环结构主要用于循环处理控制。

2.1 for循环

for循环主要存在三种形式,如下:

2.1.1 普通for循环

for(initialization; boolean-expression; step) {
    statement;
}
  • 最先执行initialization。可以声明一种类型,初始化一个或多个循环控制变量,也可以是空语句。
  • 然后,检测boolean-expression的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
  • 执行一次循环后,根据step更新循环控制变量。
  • 再次检测布尔表达式。循环执行上面的过程。

2.1.2 增强for循环

Java5中引入了一种主要用于数组或者实现了Iterable接口的类对象的增强型for循环,用来依次处理数组中的每一个元素,而不用指定具体的数组角标。

for(type variable-name : collection) {
    statement;
}

增强for循环丢掉了索引信息,当遍历集合或数组时,如果需要访问集合或数组的下标,只能使用普通for循环。

2.1.3 Java8 forEach循环

Java8中结合Lambda表达式,引入一种新的for循环,用于实现了Iterable接口的类对象的循环遍历,forEach方法是集合父接口java.lang.Iterable中新增的一个default实现方法。不了解Lambda表达式的同学可以参考我之前的一篇文章 Java8函数式编程

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

2.2 while循环

while循环是最基本的循环结构,结构为:

while(boolean-expression) {
	statement;
}

只要布尔表达式为true,循环就会一直执行下去。假如第一次判断布尔表达式就为false,那么循环体一次都不会被执行

2.3 do…while循环

do…while 循环和 while 循环相似,不同的是,对于while循环而言,如果布尔表达式条件,则不能进入循环体,而do…while循环至少会执行一次循环体。

do {
	statement;
}while(boolean-expression);

2.4 循环流程控制

在进行循环时,有时候需要根据一定的条件终止循环。Java提供两种方式终止循环,分别是break和continue。

2.4.1 break

break用于中断当前循环,存在两种形式,一种是单break形式,另一种是break label形式。区别在于break只能中断当前循环,而不能终端外层循环,如果想中断外层循环,只能通过break label的方式。

2.4.1.1 break

@Test
public void breakTest(){
    for (int i = 0; i < 3; i++) {
        System.out.println(String.format("start outer for loop index %d", i));
        for (int k = 0; k < 3; k++) {
            if (k == 1){
                break;
            }
            System.out.println(String.format("inner loop index %d", k));
        }
        System.out.println(String.format("end outer for loop index %d", i));
    }
    System.out.println("loop end");
}

运行结果:

start outer for loop index 0
inner loop index 0
end outer for loop index 0
start outer for loop index 1
inner loop index 0
end outer for loop index 1
start outer for loop index 2
inner loop index 0
end outer for loop index 2
loop end

可以看出break中断了内层循环,但是外层循环依然可以正常执行

2.4.1.2 break label

C++中有一个goto关键字,可以将逻辑跳转到相应的label。Java中goto只是一个保留字,并不是关键字,也没有相应的语义。但在java中可以通过break label达到类似的效果。

@Test
public void breakLabelTest(){
    BREAK_LABEL:
    for (int i = 0; i < 3; i++) {
        System.out.println(String.format("start outer for loop index %d", i));
        for (int k = 0; k < 3; k++) {
            if (k == 1){
                break BREAK_LABEL;
            }
            System.out.println(String.format("inner loop index %d", k));
        }
        System.out.println(String.format("end outer for loop index %d", i));
    }
    System.out.println("loop end");
}

运行结果:

start outer for loop index 0
inner loop index 0
loop end

可以看出break BREAK_LABEL中断了外层循环。

2.4.2 continue

break会中断离break关键字最近的循环体的循环,而continue只会终止本次循环,并进行本循环体的下一次循环。另外,跟break相似,continue也有两种形式,一种是单continue形式,另一种是continue label形式。

2.4.2.1 continue

@Test
 public void continueTest(){
     for (int i = 0; i < 3; i++) {
         System.out.println(String.format("start outer for loop index %d", i));
         for (int k = 0; k < 3; k++) {
             if (k == 1){
                 continue;
             }
             System.out.println(String.format("inner loop index %d", k));
         }
         System.out.println(String.format("end outer for loop index %d", i));
     }
     System.out.println("loop end");
 }

运行结果:

start outer for loop index 0
inner loop index 0
inner loop index 2
end outer for loop index 0
start outer for loop index 1
inner loop index 0
inner loop index 2
end outer for loop index 1
start outer for loop index 2
inner loop index 0
inner loop index 2
end outer for loop index 2
loop end

可以看出continue终止了k==1时的内层循环

2.4.2.2 continue label

@Test
public void continueLabelTest(){
    CONTINUE_LABEL:
    for (int i = 0; i < 3; i++) {
        System.out.println(String.format("start outer for loop index %d", i));
        for (int k = 0; k < 3; k++) {
            if (k == 1){
                continue CONTINUE_LABEL;
            }
            System.out.println(String.format("inner loop index %d", k));
        }
        System.out.println(String.format("end outer for loop index %d", i));
    }
    System.out.println("loop end");
}

运行结果:

start outer for loop index 0
inner loop index 0
start outer for loop index 1
inner loop index 0
start outer for loop index 2
inner loop index 0
loop end

“end outer for loop index”这一行没有打印,说明continue label终止了外层循环,并进行下一次循环。

3. switch语句

switch语句看一看作一种特殊的条件语句,这里在控制流程中顺带讲述一下。

switch(expression){
    case value1 :
       statement1;
       break; //可选
    case value :
       statement2;
       break; //可选
    //可以有任意数量的case语句
    default : //可选
       statement3;
}
  • switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
  • switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
  • case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
  • 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
  • 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
  • switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。

 

赞(0) 打赏
Zhuoli's Blog » Java编程拾遗『控制流程』
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址