流程控制
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。换句话说,流程控制语句就是用来控制程序中一些语句的执行时间、顺序以及次数等。
程序设计中规定的三种流程控制,即:顺序结构、分支结构、循环结构。
顺序结构
顺序结构就是从上到下顺序的执行,即上一行对某个变量的修改会对下一行产生影响。
分支结构
定义
根据条件,选择性地执行某段代码。
有if-else以及switch-case两种分支语句。
if-else
基本语法
结构一:单分支条件判断
if (条件表达式) {
语句块;
}
结构二:双分支条件判断
if (条件表达式) {
语句块1;
} else {
语句块2;
}
结构三:多分支条件判断
if (条件表达式1) {
语句块1;
} else if (条件表达式2) {
语句块2;
}
. . .
} else if (条件表达式n) {
语句块n;
} else {
语句块n + 1;
}
Scanner:键盘输入功能
1. 导包:import java.util.Scanner;
2. 创建Scanner类型的对象:Scanner scan = new Scanner(System.in);
3. 调用Scanner类的相关方法:(next() / nextXxx),来获取指定类型的变量。
4. 释放资源:scan,close();
注意:需要根据相应的方法,来输入对应类型的值。如果输入的数据类型与要求的数据类型不符合,那么就会报异常导致程序终止;不过IDEA已经自动判断类型是否符合,如果不符合,语法自动就会报错,无需进行编译即可得知。
// 步骤一:导入对应的包
import java.util.Scanner;
public class Scanner {
public static void main(String[] args) {
// 步骤二:创建一个Scanner的实例
Scanner scan = new Scanner(System.in);
// 步骤三:调用Scanner类中的方法,获取指定类型的变量
int a = scan.nextInt(); // 获取int类型
Boolean b = scan.nextBoolean(); // 获取布尔类型
String c = scan.next(); // 获取String
char d = scan.next().charAt(0);
// 在基本数据类型中,没有获取字符类型的方法,因此只能利用String获取之后再转换
// 步骤四:释放资源
scan.close();
}
}
随机数
调用Math类中的random()方法,即可获取[0, 1)范围的double类型的随机数。
如果想要获取指定类型的随机数:(int) (Math.random * (b-a+1)) + a → [a,b]
swtch-case
基本语法
switch (表达式) {
case 常量值1 :
语句块1;
// break;
case 常量值2 :
语句块2;
// break;
// . . .
[default:
语句块n + 1;
break;
]
}
执行过程
根据表达式中的值,依此匹配case语句,一旦与某一个case中的常量相等,那么就执行此case语句中的执行语句,当执行完此执行语句之后,
情况一:遇到break,则退出当前的switch-case结构;
情况二:没有遇到break。则继续执行其后的case语句,直到遇到break或者执行完所有的case及default中的语句。
注意事项
1. switch中的表达式只能是特定的数据结构:byte、short、char、inf、枚举以及String。
2. case之后跟的都是常量,使用表达式与这些常量做是否相等的判断,不能进行范围的判断。
if-else与switch-case
两者的转换
1. 开发中凡是可以用到switch-case的地方就可以用到if-else,而可以用到if-else的地方就不一定可以用到switch-case。
2. 开发中,如果两者都可以使用且代码难度相差不大,那么建议使用switch-case,他的效率稍高于if-else。
两者的对比
1. if-else可以用于范围的判断,也可以用于等职的判断,使用范围更广;switch-case语句的条件是一个变量值,只能判断变量的值是否等于case中的一个常量值,使用场景狭窄。
2. 当两者都可以使用时,推荐使用switch-case,他的效率稍高于if-else。
3. switch-case具有穿透性,可以同时执行多个分支;if-else则不具有穿透性。
循环结构
定义
根据条件,重复性的执行某段代码。
有for、while以及do-while三种循环语句。
补充:在JDK5.0之后补充了foreach循环,方便去遍历集合、数组元素等。
循环结构四要素:初始化部分、循环条件部分、循环体部分以及迭代部分。
for
for(初始化部分; 循环条件部分; 迭代部分) {
循环体部分;
}
执行顺序:当开始执行for循环时,首先执行的是初始化部分,然后就是循环条件部分,判断条件是否符合,如果符合那么就继续执行,反之就退出循环,当条件符合时,会执行循环体部分,再执行迭代部分,然后又是循环条件部分,循环体部分,迭代部分进行循环。
值得注意的是:初始化部分只执行一次,不会和其他部分一样执行多次。
while
初始化部分;
while(循环条件部分) {
循环体部分;
迭代部分;
}
执行顺序:和for的执行顺序相同,都是初始化、循环条件、循环体、迭代、循环条件、循环体、迭代. . . . . .
值得注意的是:初始化只执行一次;并且由于循环体和迭代都是放在大括号之中,因此先后并没有那么严格的要求,可以看代码的书写顺序而制定。
do-while
初始化部分;
do {
循环体部分;
迭代部分;
} while(循环条件部分);
执行顺序:do-while先执行初始化部分,然后直接执行一次循环体部分以及迭代部分,执行完之后再去判断是否满足条件,如果满足条件就继续执行,反之就退出循环。
while和for循环都是初始化之后先判断是否满足条件再决定是否执行循环体,而do-while则是不管三七二十一先执行一次循环体再判断是否满足条件。
三者区别
for和while执行的顺序相同,都是初始化、循环条件、循环体、迭代。
do-while则是初始化、循环体、迭代、循环条件。
break、continue
对于break而言,一旦执行,就跳出当前循环结构;
对于continue而言,一旦执行,就跳出本次循环,进行下一次循环。