第03章_流程控制语句
流程控制语句:用来控制程序中各语句执行顺序
的语句,可以把语句组合成能完成一定功能
的小逻辑模块。
- 顺序结构:程序从上到下逐行地执行,中间没有任何判断和跳转。
- 分支结构:根据条件,选择性地执行某段代码。
- 有
if…else
、switch-case
两种分支语句。
- 有
- 循环结构:根据循环条件,重复性的执行某段代码。
- 有
for
、while
、do-while
三种循环语句。 - 补充:JDK5.0 提供了
foreach
循环,方便的遍历集合、数组元素。(第12章集合中讲解)
- 有
分支结构
switch(表达式){
case 常量值1:
语句块1;
//break;
case 常量值2:
语句块2;
//break;
// ...
[default:
语句块n+1;
break;
]
}
switch-case 注意点:
- switch (表达式) 中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0)。
- case子句中的值必须是常量,不能是变量名或不确定的表达式值或范围。
- 同一个 switch 语句,所有 case 子句中的常量值互不相同。
- case 的穿透性:如果 case 的后面不写 break,将出现穿透现象,也就是一旦匹配成功,不会再判断下一个 case 的值,直接向后运行,直到遇到 break 或者整个 switch 语句结束,执行终止。
- break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果没有 break,程序会顺序执行到 switch 结尾。
- default 子句是可选的。同时,位置也是灵活的。当没有匹配的 case 时,执行 default 语句。
if-else 🆚 switch-case:
- 结论:凡是使用 switch-case 的结构都可以转换为 if-else 结构。反之,不成立。
- 开发经验:如果既可以使用 switch-case,又可以使用 if-else,建议使用 switch-case。因为效率稍高。
- 细节对比:
- if-else 语句优势
- if 语句的条件是一个布尔类型值,if 条件表达式为 true 则进入分支,可以用于范围的判断,也可以用于等值的判断,
使用范围更广
。 - switch 语句的条件是一个常量值 (byte, short, int, char, 枚举, String),只能判断某个变量或表达式的结果是否等于某个常量值,
使用场景较狭窄
。
- if 语句的条件是一个布尔类型值,if 条件表达式为 true 则进入分支,可以用于范围的判断,也可以用于等值的判断,
- switch-case 语句优势
- 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用 if 和 switch 都可以,习惯上使用 switch 更多。因为
效率稍高
。当条件是区间范围的判断时,只能使用 if 语句。 - 使用switch可以利用
穿透性
,同时执行多个分支,而 if-else 没有穿透性。
- 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用 if 和 switch 都可以,习惯上使用 switch 更多。因为
- if-else 语句优势
循环结构
对比 for
、while
、do-while
三种循环结构:
- do-while 循环至少执行一次循环体语句;for、while 循环先判断循环条件语句是否成立,然后决定是否执行循环体。
- 本质上:三种循环之间完全可以互相转换,都能实现循环的功能
- 遍历有明显的循环次数 (范围) 的需求,选择 for 循环
- 遍历没有明显的循环次数 (范围) 的需求,选择 while 循环
- 如果循环体语句块至少执行一次,可以考虑使用 do-while 循环
- 最简单”无限”循环格式:
while(true)
,for(;;)
- 适用场景:有时并不确定需要循环多少次,需要根据循环体内部某些条件,来控制循环的结束 (使用break)。
break 🆚 continue:
- break:一旦执行,就结束/跳出当前循环结构
- continue:一旦执行,就结束/跳出当次循环结构
- 都可以带标签使用,通过标签指明要跳过的是哪一层循环。(标号语句必须紧接在循环的头部,不能用在非循环语句的前面)
// break 语句用于终止某个语句块的执行
{ ……
break;
……
}
// break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ……
label2: { ……
label3: { ……
break label2;
……
}
}
}
class PrimeNumberTest2 {
public static void main(String[] args) {
long start = System.currentTimeMillis(); // 记录当前时间距离1970-1-1 00:00:00的毫秒数
int count = 0; // 记录质数的个数
label: for(int i = 2;i <= 100000; i++) {
for(int j = 2; j <= Math.sqrt(i); j++) {
if(i % j == 0) continue label; // 表明i有约数
}
System.out.println(i); // 一旦程序能执行到此位置,说明i就是一个质数
count++;
}
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("执行此程序花费的毫秒数为:" + (end - start));
}
}
[!info]
很多语言都有 goto 语句,goto 语句可以随意将控制转移到程序中的任意一条语句上,然后执行它,但使程序容易出错。Java 中的 break 和 continue 是不同于 goto 的。
Scanner 键盘输入
使用 java.util.Scanner 类可从键盘获取不同类型 (基本数据类型、String类型) 的变量。
- 导包:
import java.util.Scanner;
- 创建 Scanner 类型的对象:
Scanner scan = new Scanner();
- 调用 Scanner 类的相关方法 (
next() / nextXxx()
),来获取指定类型的变量 - 释放资源:
scan.close();
❗️需要根据相应的方法,来输入指定类型的值。若输入的数据类型与要求的类型不匹配,会报异常导致程序终止。
// 1.导包
import java.util.Scanner;
public class ScannerTest1 {
public static void main(String[] args) {
// 2. 创建 Scanner 对象
Scanner scanner = new Scanner(System.in);// System.in 默认代表键盘输入
// 3. 根据提示,调用 Scanner 的方法,获取不同类型的变量
System.out.println("欢迎光临你好我好交友网站!");
System.out.print("请输入你的网名:");
String name = scanner.next();
System.out.print("请输入你的年龄:");
int age = scanner.nextInt();
System.out.print("请输入你的体重:");
double weight = scanner.nextDouble();
System.out.print("你是否单身(true/false):");
boolean isSingle = scanner.nextBoolean();
System.out.print("请输入你的性别:");
char gender = scanner.next().charAt(0);//先按照字符串接收,然后再取字符串的第一个字符(下标为0)
System.out.println("你的基本情况如下:");
System.out.println("网名:" + name + "\n年龄:" + age + "\n体重:" + weight + "\n单身:" + isSingle + "\n性别:" + gender);
// 4. 关闭资源
scanner.close();
}
}
如何获取一个指定范围的随机整数:
- Math 类的
random()
的调用,会返回一个 [0,1) 范围的一个 double 型值 (int)(Math.random() * (b - a + 1)) + a
=> 获取 [a, b] 范围内的随机整数
本文作者:Joey-Wang
本文链接:https://www.cnblogs.com/joey-wang/p/18425008
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步