Java 流程控制
if 条件语句
对于任何的 if else 语句,表面上看起来 else 后面没有条件,或者 else if 后面只有一个条件。但这不是真相:因为 else 的含义是“否则”——else 本身就是一个条件!else 的隐含条件是对前面条件取反。因此下面代码是等价的:
int num = 35;
// 形式一
if (num > 60) {}
else if (num > 40) {}
else if (num > 20) {}
// 形式二,等价于形式一,加上了else的隐含条件
if (num > 60) {}
else if ((num > 40) && !(num > 60)) {}
else if ((num > 20) && !((num > 40) && !(num > 60)) && !(num > 60)) {}
使用 if else 语句有一条基本规则(不是必须的):总是优先处理范围更小的条件。
例如下面的代码,可以体现出遵守这条规则的好处:
int num = 35;
// 策略一
if (num > 20 && num <= 40) {}
else if (num > 40 && num <= 60) {}
else if (num > 60) {}
// 策略二,比起策略一,代码精简了很多,且易于阅读维护
if (num > 60) {}
else if (num > 40) {}
else if (num > 20) {}
switch 语句
jdk 1.6 以及之前的版本中:支持基本数据类型及其对应的包装类 byte、short、char、int、Byte、Short、Character、Integer 和枚举类型(Enum)。
jdk 1.7 版本开始:除了支持之前的数据类型外,还支持 String 类型。
case 标签后面的 break; 语句有及其重要的意义!Java 的 switch 语句允许省略 case 后的 break; 语句,但这种省略可能引入一个陷阱!如下代码:
int num = 1;
switch (num) {
case 1:
System.out.println("case 1");
// break;
case 2:
System.out.println("case 2");
// break;
default:
System.out.println("default");
// break;
}
结果时三条打印语句都会输出,原因在于 switch 语句的运行流程:switch 语句先求出 expression 表达式的值,然后拿这个表达式和 case 标签后的值进行比较,一旦遇到相等的值,程序开始执行这个 case 标签后的代码,不再判断与后面 case、default 标签的条件是否匹配,除非遇到 break; 才会结束。
使用 break 结束循环
break 语句不仅可以结束其所在的循环,还可直接结束其外层循环。此时需要在 break 后紧跟一个标签,这个标签用于标识一个外层循环。Java 中的标签就是一个紧跟着英文冒号(:)的标识符,Java 中的标签只有放在循环语句之前才有作用。
label: for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
break label;
}
}
使用 continue 结束循环
continue 也可以紧跟一个标签,用于直接结束标签所标识循环的当次循环,重新开始下一次循环。
label: for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
continue label;
}
}