目录
一.流程控制
1.顺序结构
任何编程语言中最常见的程序结构就是顺序结构,顺序结构就是从上到下逐行执行,中间没有任何判断和跳转。
如果Main方法的多行代码之间没有任何流程控制,则程序总从上向下依次执行,排在前面的先执行,排在后面的后执行。
public class Order {
public static void main(String[] args) {
int a=1;
int b=2;
int c=a+b;
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
2.分支结构
Java提供了两种常见的分支结构:if语句和switch语句;
if语句使用布尔表表达式或布尔值作为分支条件来进行分支控制;
switch语句则用于对多个整型值进行匹配,从而实现分支控制;
(1).if条件语句
if语句使用布尔表达式或布尔值作为分支条件来进行分支控制;
if语句有以下三种形式:单分支结构,双分支结构,多分支结构
单分支结构的语法格式:
if (条件表达式) {
语句体;
}执行流程:条件为真进入执行代码,条件为假不进入不执行代码。
双分支结构的语法格式:
if (条件表达式) {
语句体 1;
} else {
语句体 2;
}执行流程:条件为真进入 if 执行代码语句体 1,条件为假进入 else 执行代码语句体 2
多分支结构的语法格式:
if (条件表达式 1) {
语句体 1;
} else if (条件表达式 2)
{
语句体 2;
} else if (条件表达式 3)
{
语句体 3;
}. . .
else {
语句体 n;
}执行流程:条件为真进入if 执行代码语句体 1,条件为假进入 else if 并且判断条件是否为真,为真执行代码 语句体2,条件为假进 入 else 执行代码。
注意:前面都为假就执行 else 中的代码
(2).switch语句
switch语句由一个控制表达式和多个case标签组成
switch(表达式){
case 值 1:
执行代码...;
break;
case 值 2:
执行代码...;
break; ...
case 值 n-1:
执行代码...;
break;
default:
执行代码 n;
}
分支的执行流程:
先执行表达式的值,再拿着这个值去与 case 后的值进行匹配。
与哪个 case 后的值匹配为 true 就执行哪个 case 块的代码,遇到 break 就跳出 switch 分支。
如果全部 case 后的值与之匹配都是 false,则执行 default 块的代码;
示例:
java
public class CaseBlockTest
{
public static void main(String[] args)
{
// 声明变量season
var season = "秋天";
// 执行switch分支语句
switch (season)
{
case "春天", "夏天" -> {
System.out.println("春夏不是读书天.");
// 定义count变量,该变量仅在该case块中有效
int count = 20;
System.out.println(count);
}
case "秋天", "冬天" -> {
System.out.println("秋多蚊蝇冬日冷.");
// 再次定义count变量,不会与前面的count变量冲突
int count = 30;
System.out.println(count);
}
default -> {
System.out.println("读书只好等明年!");
// System.out.println(count); // 报错,找不到count变量
}
}
// System.out.println(count); // 报错,找不到count变量
}
}
Java17的新式switch语句:
为了简化switch语句的写法,Java17引入了一种新的switch语句,同时还可作为表达式使用。
javaswitch{ case value1->表达式、代码块 case value2、value3->表达式、代码块 ··· case valueN->表达式、代码块 default->表达式、代码块 }
java
public class SwitchExprTest
{
public static void main(String[] args)
{
// 声明变量score,并为其赋值为'C'
var score = 'C';
// 将switch表达式的值赋值给变量
var judge = switch (score)
{
// case后的箭头后是一个表达式
case 'A', 'B' -> "成绩还不错,希望继续保持";
case 'C', 'D', 'F' -> "成绩不足,还需努力!";
default -> "成绩输入错误";
};
System.out.println(judge);
var judge2 = switch (score)
{
// case后的代码块有多条语句,使用yield返回值
case 'A', 'B' -> {
System.out.println("成绩还不错,希望继续保持");
yield "优良";
}
// case后的代码块有多条语句,使用yield返回值
case 'C', 'D', 'F' -> {
System.out.println("成绩不足,还需努力!");
yield "不足";
}
default -> "成绩输入错误";
};
System.out.println(judge2);
var judge3 = switch (score)
{
// case后的代码块有多条语句,使用yield返回值
case 'A', 'B':
System.out.println("成绩还不错,希望继续保持");
yield "优良";
// 传统case后即使只有一条语句,也需要使用yield返回值
case 'C', 'D', 'F':
yield "不足";
default:
yield "成绩输入错误";
};
System.out.println(judge3);
}
}
使用 switch 分支的几点注意事项:
表达式类型只能是 byte、short、int、char,JDK5 开始支持枚举,JDK7 开始支持 String、不支持 double、float、long
case 给出的值不允许重复,且只能是字面量,不能是变量
正常使用 switch 的时候,不要忘记写 break,否则会出现穿透现象
当存在多个 case 分支的代码相同时,可以把相同的代码放到一个 case 块中,其他的 case 块都通过穿透性穿透到该 case 块执行代码即可,这样可以简化代码。
if、switch 的比较,以及各自适合什么业务场景?
- if 在功能上远远强大于 switch
- 当前条件是区间的时候,应该使用 if 分支结构
- 当条件是与一个一个的值比较的时候,switch 分支更合适:格式良好,性能较好,代码优雅
(3).循环结构
for循环
for 循环:控制一段代码反复执行很多次。
for 循环语法格式:
for (初始化语句; 循环条件; 迭代语句) {
循环体语句(重复执行的代码);
}//例如:
// 输出 3 次 Hello World
for (int i = 0; i < 3; i++) {
System.out.println("Hello World");
}
while 循环:
初始化语句;
while (循环条件) {
循环体语句(被重复执行的代码);
迭代语句;
}//例如:
int i = 0;
while (i < 3) {
System.out.println("Hello World");
i++;
}
do-while 循环
初始化语句;
do {
循环体语句;
迭代语句;
} while (循环条件);//例如:
int i = 0;
do {
System.out.println("Hello World!");
i++;
} while( i < 3);
三种循环的区别小结
for 循环 和 while 循环(先判断后执行); do...while (先执行后判断)
for 循环和 while 循环的执行流程是一模一样的,功能上无区别,for 能做的 while 也能做,反之亦然。
使用规范:如果已知循环次数建议使用 for 循环,如果不清楚要循环多少次建议使用while 循环。
其他区别:for 循环中,控制循环的变量只在循环中使用。while 循环中,控制循环的变量在循环后还可以继续使用
二.数组类型
数组是编程语言中最常见的一种数据结构,可用来存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素。
数组也是一种引用类型,例如int是一种基本类型。但int[ ]就是一个引用类型;