目录
前言
Java中的分支和循环语句是非常重要的工具,用于根据条件和需求来控制程序的流程。分支语句可以根据条件的真假执行不同的代码块,而循环语句可以重复执行某段代码,直到满足退出条件。这些语句使得程序能够根据不同的情况进行选择和重复执行,从而实现灵活的逻辑和流程控制。合理使用分支和循环语句可以使程序更加可读、健壮和高效。
在日常生活中,无论是做饭、做家务还是进行其他任务,顺序结构都是我们常常遵循的一种方式,确保每个步骤按照正确的顺序依次执行。在编程中,也需要使用顺序结构来组织代码,以按照特定的逻辑和需求顺序执行不同的操作。
当然,除了按部就班的顺序之外,我们经常需要根据不同的条件做出不同的选择。例如,当我们决定今天的穿着时,可能会考虑天气条件。如果是晴天,会选择轻便的衣物,而如果是下雨,会选择带雨衣或雨伞。这种基于条件的选择就是一种分支的应用。
在生活中,我们经常需要重复执行某些任务,直到满足某个条件。比如,做饭的过程中,你可能需要反复搅拌食材直到它们煮熟。这就是一个循环的应用,直到达到预期的状态才停止。
一、分支结构
1.if 条件语句
表现形式 1:
if (布尔表达式){ //行为语句 }
当满足if条件,即布尔表达式结果为true,执行{ }内行为语句,否则不执行。
例:
int a = 10; int b = 10; if (a == b) { System.out.println("相等"); } //输出:相等
表现形式 2:
if (布尔表达式) { //行为A }else { //行为B }
当布尔表达式为真(true)执行语句A,为假(false)则执行语句B。
例:
int a = 10; //或a = 20 int b = 10; if (a == b) { System.out.println("相等"); }else { System.out.println("不相等"); } //a = 10 输出:相等 //a = 20 输出:不相等
表达式 3:
if(布尔表达式1) { //行为A }else if(布尔表达式2) { //行为B }else { //行为C }
先判断布尔表达式1,若其不为真(true)继续判断布尔表达式2,若布尔表达式2为真(true)则执行语句B,若其也为假(false)则执行语句C。
例:
int a = 10; int b = 20; if (a == b) { System.out.println("相等"); }else if(a > b){ System.out.println("a较大"); }else { System.out.println("b较大") } //输出结果:b较大
注意:
Java中的if语句应该在条件后不应该加分号,因为分号会被视为代码块的一部分,可能导致意外的结果。
另外,当if、else if、else后的执行语句超过一行时,需要使用花括号({ })括起来,为了确保代码的正确性和可读性,建议无论执行语句是一行还是多行,都使用花括号({ })括起来。即使只有一行代码,使用花括号也是一个良好的编程习惯。这样可以清晰地标识出代码块,避免可能的错误和歧义。
2.switch选择语句
表现形式:
switch(表达式){ case 常量值1:{ 行为A; break; } case 常量值2:{ 行为B; break; } . . . default:{ 无匹配常量; break; }
switch选择语句,需要先获取表达式的结果,根据其结果与case依次对应,知道找到相应的case并执行case对应的语句;如果没有与表达式对应的case,则执行default,需要注意的是,在switch中需要用break结束当前case并跳出switch语句。
注意:
在Java中,switch语句的括号内只能是以下几种类型的表达式
- 整数类型(byte、short、int、char(不包括long)):可以使用整数常量或整数变量作为表达式。
- 字符类型(char):可以使用字符常量或字符变量作为表达式。
- 字符串类型(String):可以使用字符串常量或字符串变量作为表达式。
- 枚举类型:可以使用枚举类型常量作为表达式。
§ Java SE 7及以上版本支持的一些特定类型:可以使用包装类(Boolean、Byte、Short、Integer、Character)、enum类型、字符串的字面常量、null常量等作为表达式。
- case中的常量值必须是唯一且常量的,不能是变量或可计算的表达式。
- case标签中的常量值不能重复,否则会导致编译错误。
- switch语句中的case语句的顺序是有意义的,它们按顺序进行匹配。所以,大部分情况下,我们会使用break语句来终止每个case的执行,以防止执行其他case的代码块。
在每个case中,可以有一个或多个语句,可以使用花括号包围起来,也可以省略花括号。如果没有使用break语句,程序将会顺序执行后续的case语句,直到遇到break语句或switch语句结束。
需要注意的是,如果没有与表达式匹配的case,并且没有提供default语句,程序将不会执行任何代码块。
3.if switch 对比
if条件语句和switch选择语句都是在Java中用于根据不同条件来执行不同代码块的结构。它们有一些共同点,但也有一些区别。
共同点:
- 都是根据条件来选择执行的代码块。
- 都可以用于多条件的情况,根据条件的匹配来选择执行的代码逻辑。
- 都可以使用默认的代码块(if语句中的else,switch语句中的default)来处理未匹配到的情况。
- 都可以嵌套使用,即在一个条件语句或选择语句的代码块中包含另一个条件语句或选择语句。
区别:
- if条件语句更适合处理复杂的条件逻辑,因为它可以使用任意的布尔表达式作为条件,灵活性更高。
- switch选择语句更适合处理固定的、单一的数值或枚举类型的条件,因为它使用固定的值进行匹配。如果条件是一个范围或一个复杂的判断条件,更适合使用if条件语句。
- if条件语句可以使用逻辑运算符(如&&、||)来组合多个条件,以及使用if-else if-else结构来处理多种情况。而switch选择语句只能根据固定值的匹配来选择执行代码块。
- if条件语句在执行时可以跳过不满足条件的代码块而继续执行下一个代码块,不需要显式使用break语句。而switch选择语句在每个case的代码块末尾需要加上break语句,以避免执行其他case的代码块。
选择使用if条件语句还是switch选择语句取决于具体的情况和需求。如果条件较为简单且固定,且判断的是某个变量的确定值,switch选择语句可能更适合。而如果条件较为复杂,需要使用布尔表达式,或者有多个互斥的条件,if条件语句更加灵活。
二、循环结构
1.while 循环
表现形式:
while(循环条件){ //循环语句; }
循环条件为true继续循环,为false时跳出循环
例:
//遍历1~10 int num = 1; while (num <= 10) { System.out.println(num); num++; }
while支持嵌套
例:
int n = 1; int sum = 0; while (n <= 5) { //1~n 阶乘的和 int res = 1; int m = 1; while (m <= n) { //内层循环:求n的阶乘 res *= m; m++; } sum += res; n++; } System.out.println("sum = " + sum)
注意:与if条件语句类似,while ( ) 后不能加分号( ; ),且建议用花括号{ }括起执行语句。
循环的退出
1.break:
break 可以让循环提前结束,当程序运行过程中遇到break便会直接退出循环。
例:如下代码表示1~500的循环打印,但是通过break语句可以使其在循环至a=9时主动退出循环;
int a = 1; while(a <= 500) { if (a == 10) { break; } System.out.println(a++); }
运行结果:
2. continue
与 break 不同,continue 虽然也完成了退出循环的操作,但是只会跳过本次循环, 立即进入下次循环.,而非是结束所有循环。
同样遍历打印1~500,当a处于5~495时执行continue操作,运行时便会直接进入下一次循环。
(注意:遇到continue会跳过当前循环,不在继续执行其后语句,所以当类似下列代码中循环条件的更新在continue之后的需要将其在continue之前书写,否则循环条件不会发生变化,进入死循环)
int a = 1; while(a < 500) { if ((a >= 5)&&(a <= 495)) { a++; //此处不可少否则进入死循环 continue; } System.out.println(a++); }
结果:
2.for循环
表现形式 :
for(表达式A, 布尔表达式boolean, 表达式B) { 执行语句; }
常用的表示形式为:for (int i = 0 ,i < 实际条件 , i++) { 执行语句 }
例如:
//遍历数组arr int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }
增强for:for-each
for-each是一个用于遍历集合(如数组、列表、映射等)的循环结构。它是for循环的一种简化形式,可以更方便地遍历集合中的元素。
使用for-each循环时,需要提供一个被遍历的集合对象,并指定一个代码块来处理每个元素。
for (elementDataType element : collection) { // 代码块 } //elementDataType 是集合中元素的数据类型 //collection 是要遍历的集合对象 //element 是在循环中遍历的当前元素
示例如下:
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 使用增强for循环遍历数组并打印每个元素 for (int element : arr) { System.out.println(element); }
注意:增强for循环只适用于迭代遍历,并且不能在循环中修改集合的元素。如果需要进行修改操作,建议使用传统的for循环结构。
3.do while 循环
表现形式:
do{ 循环体语句; }while(循环条件)
先执行循环体中的代码,然后再判断条件是否为真。如果条件为真(true),继续执行下一轮循环,否则退出循环。这样可以确保至少执行一次循环体的代码。
例:
//遍历1~10 int num = 1; do { System.out.println(num); num++; } while (num <= 10);
注意:do while循环中最后 while( )后需要加分号( ; )。
4.三者对比
-
while循环:
- 首先检查条件是否为真,如果为真,则执行循环体中的代码。
- 执行完循环体后,再次检查条件是否为真,如果为真,则继续执行循环体,否则退出循环。
- 适用于需要根据条件来重复执行的情况,且循环次数不确定。
-
for循环:
- 包含初始化、条件判断和循环迭代三部分的完整语法结构。
- 在初始化阶段进行变量的初始化。
- 在条件判断阶段判断循环是否继续执行。
- 在循环迭代阶段更新循环变量的值。
- 适用于已知循环次数的情况,程序员可以更清晰地控制循环的起始、结束和步长。
-
do-while循环:
- 先执行循环体中的代码,然后再根据条件进行判断是否继续执行循环。
- 即使条件一开始就不满足,也至少会执行一次循环体。
- 适用于需要至少执行一次的情况,或者需要在循环结束后再次检查条件的情况。
综合而言,while循环和for循环在开始之前就进行条件判断,而do-while循环在循环体执行之后进行条件判断。
总结
分支结构(if语句和switch语句)根据条件执行不同的代码块,循环结构(while循环和for循环)重复执行某段代码。它们是控制程序流程的工具,使程序具有灵活的逻辑和流程控制能力。适当使用分支和循环结构可以提高代码的可读性、健壮性和效率。分支结构根据条件判断选择执行不同代码块,循环结构根据循环条件重复执行代码。增强for循环用于遍历集合、数组等可迭代对象。选择适当的结构取决于具体情况和任务需求。