1. 单分支语句
格式
if(条件表达式){
语句块;
}
说明
条件表达式必须是布尔表达式(关系表达式或逻辑表达式)或 布尔变量
执行流程
- 首先判断条件表达式看其结果是true还是false
- 如果是true就执行语句块
- 如果是false就不执行语句块
2. 双分支语句
格式
if(条件表达式) {
语句块1;
}else {
语句块2;
}
执行流程
- 首先判断条件表达式看其结果是true还是false
- 如果是true就执行语句块1
- 如果是false就执行语句块2
3. 多分支语句
格式
if (条件表达式1) {
语句块1;
} else if (条件表达式2) {
语句块2;
}
...
}else if (条件表达式n) {
语句块n;
} else {
语句块n+1;
}
说明
一旦条件表达式为true,则进入执行相应的语句块。执行完对应的语句块之后,就跳出当前结构。
执行流程
- 首先判断关系表达式1看其结果是true还是false
- 如果是true就执行语句块1,然后结束当前多分支
- 如果是false就继续判断关系表达式2看其结果是true还是false
- 如果是true就执行语句块2,然后结束当前多分支
- 如果是false就继续判断关系表达式…看其结果是true还是false
…
n. 如果没有任何关系表达式为true,就执行语句块n+1,然后结束当前多分支
4. if……else嵌套
概述
在 if 的语句块中,或者是在else语句块中,又包含了另外一个条件判断(可以是单分支、双分支、多分支),就构成了嵌套结构
执行的特点
- 如果是嵌套在if语句块中的,只有当外部的if条件满足,才会去判断内部的条件
- 如果是嵌套在else语句块中的,只有当外部的if条件不满足,进入else后,才会去判断内部的条件
补充
- 语句块只有一条执行语句时,一对
{}可以省略,但建议保 - 当if-else结构是“多选一”时,最后的
else是可选的,根据需要可以省略
如果大于95℃,则打印“开水”
如果大于70℃且小于等于95℃,则打印“热水”
如果大于40℃且小于等于70℃,则打印“温水”
如果小于等于40℃,则打印“凉水”
public class IfElseExer {
public static void main(String[] args) {
int waterTemperature = 85;
if(waterTemperature > 95){
System.out.println("开水");
}else if(waterTemperature > 70 && waterTemperature <= 95){
System.out.println("热水");
}else if(waterTemperature > 40 && waterTemperature <= 70){
System.out.println("温水");
}else{
System.out.println("凉水");
}
}
}
5. switch-case选择结构
1、基本语法
语法格式
switch(表达式){
case 常量值1:
语句块1;
//break;
case 常量值2:
语句块2;
//break;
// ...
[default:
语句块n+1;
break;
]
}
执行流程图
执行过程
-
根据switch中表达式的值,依次匹配各个case。如果表达式的值等于某个case中的常量值,则执行对应case中的执行语句
-
执行完此case的执行语句以后
-
情况1:如果遇到break,则执行break并跳出当前的switch-case结构
-
情况2:如果没有遇到break,则会继续执行当前case之后的其它case中的执行语句
...
-
直到遇到break关键字或执行完所有的case及default的执行语句,跳出当前的switch-case结构
-
注意点
-
switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0)
-
case子句中的值必须是常量,不能是变量名或不确定的表达式值或范围
-
同一个switch语句,所有case子句中的常量值互不相同
-
break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾
-
default子句是可选的。同时,位置也是灵活的。当没有匹配的case时,执行default语句
2、case穿透
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是一旦匹配成功,不会在判断下一个case的值,直接向后运行,直到遇到break或者整个switch语句结束,执行终止
3、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),只能判断某个变量或表达式的结果是否等于某个常量值,使用场景较狭窄
-
switch语句优势
- 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用if和switch都可以,习惯上使用switch更多。因为效率稍高。当条件是区间范围的判断时,只能使用if语句。
- 使用switch可以利用穿透性,同时执行多个分支,而if...else没有穿透性。
6. for循环
语法格式
for (①初始化部分; ②循环条件部分; ④迭代部分){
③循环体部分;
}
执行流程图
说明
- for( ; ; ) 中的两个;不能多也不能少
- ①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
- ②循环条件部分为boolean类型表达式,当值为false时,退出循环
- ④可以有多个变量更新,用逗号分隔
举例
// 控制台输出5行Hello World!
public class ForTest {
public static void main(String[] args) {
for(int i = 1;i <= 5;i++){
System.out.println("Hello World!");
}
}
}
7. while循环
语法格式
①初始化部分
while(②循环条件部分){
③循环体部分;
④迭代部分;
}
执行流程图
说明
- while(循环条件)中循环条件必须是boolean类型。
- 注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环。
- for循环和while循环可以相互转换。二者没有性能上的差别。实际开发中,根据具体结构的情况,选择哪个格式更合适、美观。
- for循环与while循环的区别:初始化条件部分的作用域不同。
举例
// 控制台输出5行Hello World!
class WhileTest {
public static void main(String[] args) {
int i = 1;
while(i <= 5){
System.out.println("Hello World!");
i++;
}
}
}
8. do-while循环
语法格式
①初始化部分;
do{
③循环体部分
④迭代部分
}while(②循环条件部分);
执行流程图
说明
- 结尾while(循环条件)中循环条件必须是boolean类型
- do{}while();最后有一个分号
- do-while结构的循环体语句是至少会执行一次,这个和for和while是不一样的
- 循环的三个结构for、while、do-while三者是可以相互转换的。
举例
// 遍历1-100的偶数,并计算所有偶数的和、偶数的个数
class DoWhileTest {
public static void main(String[] args) {
//初始化部分
int num = 1;
int sum = 0;//记录1-100所有的偶数的和
int count = 0;//记录1-100之间偶数的个数
do{
//循环体部分
if(num % 2 == 0){
System.out.println(num);
sum += num;
count++;
}
num++;//迭代部分
}while(num <= 100); //循环条件部分
System.out.println("偶数的总和为:" + sum);
System.out.println("偶数的个数为:" + count);
}
}
9. 三种循环对比
- 三种循环结构都具有四个要素
- 循环变量的初始化条件
- 循环条件
- 循环体语句块
- 循环变量的修改的迭代表达式
- 从循环次数角度分析
- do-while循环至少执行一次循环体语句。
- for和while循环先判断循环条件语句是否成立,然后决定是否执行循环体。
- 如何选择
- 遍历有明显的循环次数(范围)的需求,选择for循环
- 遍历没有明显的循环次数(范围)的需求,选择while循环
- 如果循环体语句块至少执行一次,可以考虑使用do-while循环
- 本质上:三种循环之间完全可以互相转换,都能实现循环的功能
10. 无限循环
格式
while(true);
for(;;);
使用场景
- 开发中,有时并不确定需要循环多少次,需要根据循环体内部某些条件,来控制循环的结束(使用break)
- 如果此循环结构不能终止,则构成了死循环!开发中要避免出现死循环
11. 嵌套循环
1、使用说明
- 所谓嵌套循环,是指一个循环结构A的循环体是另一个循环结构B。比如,for循环里面还有一个for循环,就是嵌套循环。其中,for ,while ,do-while均可以作为外层循环或内层循环。
- 外层循环:循环结构A
- 内层循环:循环结构B
- 实质上,嵌套循环就是把内层循环当成外层循环的循环体。只有当内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的外层循环。
- 设外层循环次数为
m次,内层为n次,则内层循环体实际上需要执行m*n次。 - **技巧:**从二维图形的角度看,外层循环控制
行数,内层循环控制列数。 - **开发经验:**实际开发中,我们最多见到的嵌套循环是两层。一般不会出现超过三层的嵌套循环。如果将要出现,一定要停下来重新梳理业务逻辑,重新思考算法的实现,控制在三层以内。否则,可读性会很差。
2、案例
// 打印九九乘法表
public class ForForTest5 {
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();
}
}
}
12. break和continue
1、概述
| 适用范围 | 循环中作用 | 相同点 | |
|---|---|---|---|
| break | switch-case 循环结构 | 一旦执行,就结束(或跳出)当前循环结构 | 此关键字的后面,不能声明语句 |
| continue | 循环结构 | 一旦执行,就结束(或跳出)当次循环结构 | 此关键字的后面,不能声明语句 |
2、示例
class BreakContinueTest1 {
public static void main(String[] args) {
for(int i = 1;i <= 10;i++){
if(i % 4 == 0){
//break;//123
continue;//123567910
//如下的语句不可能被执行,编译不通过
//System.out.println("今晚迪丽热巴要约我吃饭");
}
System.out.print(i);
}
System.out.println("####");
//嵌套循环中的使用
for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break; //结束的是包裹break关键字的最近的一层循环!
continue;//结束的是包裹break关键字的最近的一层循环的当次!
}
System.out.print(j);
}
System.out.println();
}
}
}
3、带标签的使用
break语句用于终止某个语句块的执行
{ ……
break;
……
}
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ……
label2: { ……
label3: { ……
break label2;
……
}
}
}
- continue语句出现在多层嵌套的循环语句体中时,也可以通过标签指明要跳过的是哪一层循环
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面
class BreakContinueTest2 {
public static void main(String[] args) {
l:for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break l;
continue l;
}
System.out.print(j);
}
System.out.println();
}
}
}
13. 获取随机数
如何产生一个指定范围的随机整数?
Math类的random()的调用,会返回一个[0,1)范围的一个double型值
- Math.random() * 100 ---> [0,100)
- (int)(Math.random() * 100) ---> [0,99]
- (int)(Math.random() * 100) + 5 ----> [5,104]
如何获取[a,b]范围内的随机整数呢?(int)(Math.random() * (b - a + 1)) + a
举例
class MathRandomTest {
public static void main(String[] args) {
double value = Math.random();
System.out.println(value);
//[1,6]
int number = (int)(Math.random() * 6) + 1; //
System.out.println(number);
}
}