2.1 顺序结构
顺序结构就是程序从上到下逐行地执行。表达式语句都是顺序执行的。并且上一行对某个变量的修改对下一行会产生影响。
2.2 分支语句
2.2.1 if 条件判断结构
2.2.1.1 单分支条件判断
-
格式
if (条件表达式) { // 代码; }
-
执行流程
2.2.1.2 双分支条件判断
-
格式
if (条件表达式) { // 代码1; } else { // 代码2; }
-
执行流程
2.2.1.3 多分支条件判断
-
格式
if (条件表达式1) { // 代码1; } else if (条件表达式2) { // 代码2; } ... } else if (条件表达式n) { // 代码n; } else { // 代码n+1; }
-
执行流程
2.2.2 switch 选择结构
-
格式
switch (表达式) { case 常量值1; // 语句1; [break;] case 常量值2; //语句2; [break;] ... [ default: //语句n; break; ] }
-
执行流程
-
注意事项
- 表达式类型只能是 byte 、short、int、char、Stirng、枚举。
- case 给出的值不允许重复,且只能是字面量,不能是变量。
- 一个 case 对应一个 break,如果没有写 break,会造成 case 击穿,但 case 击穿在一些特定的场合也能运用到,例如:多个 case 的内容一样,我们就可以使用 case 击穿简化代码。
2.2.2.1 case 击穿
在 switch 语句中,如果 case 的后面不写 break,将出现穿透现象,也就是一旦 匹配成功,不会在判断下一个 case 的值,直接向后运行,直到遇到 break 或者整个 switch 语句结束,执行终止。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个[0,10]的整数:");
int num = sc.nextInt();
switch (num) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
System.out.println("差评~");
break;
case 8:
case 9:
System.out.println("良好");
break;
case 10:
System.out.println("优秀");
break;
default:
System.out.println("您输入的整数有误,请重新输入区间为[0,10]的整数~");
break;
}
}
public static void main(String[] args) {
int a = 7;
switch (a++) { // 第一步:a = 7
case 8:
a *= 2;
default: // 第二步:a = 8
a += 2.5; // 第三步:a = 10
case 9:
++a; // 第四步:a = 11
case 10:
a--; // 第五步:a = 10
break;
case 11:
a %= 2;
}
System.out.println(a);
}
2.2.3 switch 和 if 的比较
- 凡是使用 switch-case 的结构都可以转换为 if-else 结构。反之,不成立。
- 当前条件是区间的时候,应该使用 if 分支结构;当条件是与一个一个的值比较的时候,switch 分支更合适。
2.3 循环语句
2.3.1 for 循环
-
格式
for (①初始化部分; ②循环条件部分; ④迭代部分) { ③循环语句 }
-
执行流程
① -> ② -> ③ -> ④ -> ② -> ③ -> ④ -> ② -> ③ -> ④ -> … -> ② 判断为 false,则循环结束。
// 水仙花数例子
public static void main(String[] args) {
int count = 0;
for (int i = 100; i < 1000; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i){
count ++;
System.out.println(i);
}
}
System.out.println("水仙花数个数为:" + count);
}
2.3.2 while 循环
-
格式
①初始化部分; while (②循环条件) { ③循环语句; ④迭代部分; }
-
执行流程
① -> ② -> ③ -> ④ -> ② -> ③ -> ④ - >② -> ③ -> ④ -> … -> ② 判断为 false,则循环结束。
public static void main(String[] args) {
int sum = 0, i = 1;
while (i <= 50) {
if (i % 2 == 0) {
sum += i;
}
i++;
}
System.out.println("1~50的偶数和为:" + sum);
}
2.3.3 do-while 循环
-
格式
①初始化部分; do{ ③循环体部分 ④迭代部分 }while(②循环条件部分);
-
执行流程
① -> ③ -> ④ -> ② -> ③ -> ④ -> ② -> ③ -> ④ -> … -> ②
public static void main(String[] args) {
int count = 0, i = 1;
do {
if (i % 2 == 0 && i % 3 == 0) {
count++;
}
i++;
} while (i <= 100);
System.out.println("1~100之间能同时被2和3整除的个数为:" + count);
}
2.3.4 对比三种循环结构
三种循环的异同点
相同点:
都可以执行某一段代码。
不同点:
for、while 都是先判断后执行;
do-while 先执行一次,后判断。
使用场景:
- for:明确循环次数的;
- while:循环次数不明确;
- do-while:一般不是使用。
2.3.5 “死” 循环
// 最简单"无限"循环格式
// 格式一
while (true) {}
// 格式二
for (;;) {}
// 格式三
do {
} while (true);
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入用户账号:");
int user = sc.nextInt();
System.out.println("请输入用户密码:");
int password = sc.nextInt();
if (user == 123 && password == 456) {
System.out.println("登录成功~");
break;
}
System.out.println("登录失败~");
}
}
2.3.6 嵌套循环
for 循环、while 循环、doWhile 循环都可以相互嵌套,并无特殊要求。
// 九九乘法表例子
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
System.out.println();
}
}
2.4 跳转空值 break、continue
break:跳出并结束当前循环的执行,如果有两个循环嵌套,结束离 break 最近的那个循环。
continue:跳出当前循环的当次执行,直接进入循环的下一次执行。
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
if (i % 2 == 0) {
break;
}
System.out.print(i + "\t"); // 1
}
System.out.println();
for (int j = 1; j <= 5; j++) {
if (j % 2 == 0) {
continue;
}
System.out.print(j + "\t"); // 1 3 5
}
}
2.4.1 标签使用
// break 语句用于终止某个语句块的执行
{
……
break;
……
}
// break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1:{……
label2:{……
continue labe1;
label3:{……
break label2;
}
}
}
public static void main(String[] args) {
// 找到高三二班
label:
for (int i = 1; i <= 3; i++) {
System.out.println("高" + i);
for (int j = 1; j <= 3; j++) {
if (i == 3 && j == 2) {
break label;
}
System.out.println("\t高" + i + "-" + j + "班");
}
}
}
2.5 获取随机数 Random / random()
2.5.1 通过 Random 类的方法
// 公式1:
r.nextInt(max - min + 1) + min; // [min, max]
// 公式2【JDK17】:
r.nextInt(min, max + 1); // [min, max]
public static void main(String[] args) {
Random r = new Random();
// 生成一个[-2^23, (2^23)-1)之间的整数
System.out.println(r.nextInt());
// 生成一个[0, 10)之间的整数
System.out.println(r.nextInt(10));
// 生成一个[1, 10]之间的整数
System.out.println(r.nextInt(10) + 1);
// 生成一个[1024,9024]之间的整数
// 方式一:r.nextInt(max - min + 1) + min
System.out.println(r.nextInt(8001) + 1024);
// 方式二:r.nextInt(min, max + 1)
System.out.println(r.nextInt(1024, 9025));
}
2.5.2 通过 Math 类的 random() 方法
Math 类的 random()的调用,会返回一个[0,1)范围的一个 double 型值。
如何获取
[min, max]
范围内的随机整数呢?(int)(Math.random() * (max - min + 1)) + min
Math.random() * 100 // 获取 [0,100) 范围内的随机整数 (int)(Math.random() * 100) // 获取 [0,100) 范围内的随机整数 (int)(Math.random() * 100) + 5 // 获取 [5,105) 范围内的随机整数 (int) (Math.random() * 17) + 42; // 生成[42,58]的随机数