Java基础-第三章(流程语句)

本文详细介绍了Java中的流程控制语句,包括顺序结构、选择结构(if与switch)和循环结构(while、do-while、for),以及控制循环结构的break、continue和return语句。通过案例分析了各种结构的使用场景和注意事项,帮助读者深入理解Java的流程控制。
摘要由CSDN通过智能技术生成

一.顺序结构

如果代码里没有流程控制,程序是按照书写的格式从上而下一行一行执行的;一条语句执行完后继续执行下一条语句,中间没有判断和跳转,直到程序结束;

public class SequenceDemo{
    public static void main(String[] args){
        //顺序结构: 自上而下一行一行的顺序执行;
        System.out.println("A");
        System.out.println("B");
        System.out.println("C");
        System.out.println("D");
    }
}

二.选择结构

如果使用程序描述”如果今天是周一,就上班;如果今天是周二就逛街;如果今天是周三就去公园……..”;显然使用顺序结构是搞不定的;

因为此时程序具有多个条件,需要通过条件判断来决定程序具体做什么,那该如何呢?

通过判断条件来做选择的语句,我们称为选择语句分支语句;选择结构有两种分别是ifswitch;

1.if语句

if语句使用boolean表达式或boolean值作为选择条件,有三种结构形式;
if翻译成中文,表示: 如果………..,就做……..;

1).if结构
if(boolean表达式){
    条件执行体
}

具体实现:

//判断10大于3吗?如果大于,输出:10大于3
if(10 > 3){
    System.out.println("10大于3");
}
System.out.println("ending...........");

if后面跟的{}表示一个整体的代码块,我们称为条件执行体,也就是说条件为true,就执行这一块代码块;

if语句的使用注意:

  • 1).在if(boolean表达式)后面,{}的前面,是没有分号的;
  • 2).如果if语句只有控制一句话,那么可以不使用{};企业规范: 都要求,无论if控制几句话,统统使用花括号;
  • 3).操作boolean类型的变量的时候,应该符合下列示例要求:
boolean isMan = false;
if(isMan){
    System.out.println("专业");
}

boolean isMan = true;
if(!isMan){
    System.out.println("专业");
}
2).if-else结构
if(boolean表达式){
    条件执行体A
}else{
    条件执行体B
}

具体实现:

boolean isMan = false;
if(isMan){
    System.out.println("条件执行体A");
}else{
    System.out.println("条件执行体B");
}

if-else语句和三元运算符:

从语义上二者的含义相同;
从本质上说,if-else是语句结构,三元运算符是一种运算符号;
三元运算符必须有一个结果,表达式必须有一个结果,冒号两边的值必须是同一数据类型,必须有返回;
而if-else不能返回什么结果,只能控制语句的结构;

求最大最小值,分页的案例:

//求最大最小值,分页的案例

//if-else语句的例子
int x = 100;
int y = 20;

if(x >= y){
    System.out.println("x大于y");
}else{
    System.out.println("x小于y");
}

//三元运算符的例子
String ret = x >= y ? "x大于y" :"x小于y";
System.out.println(ret);

if-else语句的使用注意:

  • 1).不能在if(boolean表达式),使用分号;
  • 2).不能直接使用else语句;
3).if-else if-else结构
if(boolean表达式A){
    条件执行体A
}else if(boolean表达式B){
    条件执行体B
}else{
    条件执行体C
}

具体实现:

//输出星期几问题的代码实现
int day= 5;

if(day == 1){
    System.out.println("周一");
}else if(day == 2){
    System.out.println("周二");
}else if(day == 3){
    System.out.println("周三");
}else if(day == 4){
    System.out.println("周四");
}else if(day == 5){
    System.out.println("周五");
}else if(day == 6){
    System.out.println("周六");
}else if(day == 7){
    System.out.println("周日");
}else{
    System.out.println("您的输入有误!");
}

if-else if-else语句的使用注意:

  • 1).不能在if(boolean表达式),使用分号;
  • 2).不能是else if(boolean表达式)后面使用分号;
  • 3).不能直接使用else if语句,必须先使用if语句;
  • 4).此时的else语句,表示上述所有条件都为false的时候才会执行的代码;
4).计算成绩等级的案例

需求:考试成绩大于90分,打印优;如果大于80分,打印良;如果大于70分,打印中;其他情况打印多多努力;

具体实现:

int score = 79;

if(score >= 90){
    System.out.println("优");
}else if(score >= 80 && score < 90){
    System.out.println("良");
}else if(score >= 70 && score < 80){
    System.out.println("中");
}else{
    System.out.println("多多努力");
}
2.switch语句
1).基本使用

switch语句结构的格式如下:

switch(整型表达式){
    case A值:
        表达式的结果等于条件1时,执行此语句;
        break;
    case B值:
        表达式的结果等于条件2时,执行此语句;
        break;
    case C值:
        表达式的结果等于条件3时,执行此语句;
        break;
    default:
        以上条件都不满足时,执行此语句;                        
}

注意: case后面的表达式必须是常量;

具体实现:

int weekday= 8;

switch(weekday){
    case 1:
        System.out.println("周一");
        break;
    case 2:
        System.out.println("周二");
        break;
    case 3:
        System.out.println("周三");
        break;
    case 4:
        System.out.println("周四");
        break;
    case 5:
        System.out.println("周五");
        break;
    case 6:
        System.out.println("周六");
        break;
    case 7:
        System.out.println("周日");
        break;
    default:
        System.out.println("没有这一天!");           
}
2).使用注意

switch的使用细节和使用注意:

switch语句适用于对多个整型值进行匹配判断,从而实现条件的分支控制;

和if语句不同的是: if语句后面是根据boolean表达式判断的,所以表达式的结构可以任意写,而switch只是相当于做”表达式==数

值”的boolean表达式判断;推出: 其实if更强大,switch仅仅只是对整数类型的判断而已,使用更简单;

这里数值的类型是除了long之外的类型,也就是说switch支持的类型是byte,short,char,int;

本质: switch仅仅只能支持int类型,(byte,short,char会自动类型提升为int类型);

switch语句选择的基本数据类型只有四种: byte,short,char,int;没有long;支持的引用类型是以上四个基本类型的包装类;依次是Byte,Short,Character,Integer以及从Java5开始支持枚举和Java7开始支持的String类;

case只是用来为switch选择一个执行代码的入口,如果一旦进入某个入口之后,后面的case实际上已经失去了判断的意义;也就是说代码在进入switch执行的时候会把入口case之后的case统统忽略掉;会一直往下执行,知道遇到了break或return;(穿透);所以可以发现,每一个case后面没有{}这个符号来表示一个代码块;

switch语句穿透的具体实现:

int weekday= 1;

switch(weekday){
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        System.out.println("工作日");
        break;
    case 6:
    case 7:
        System.out.println("休息日");
        break;
    default:
        System.out.println("没有这一天!");           
}
3).if和switch的选择

if和switch都是属于选择语句,也就是说功能是相似的;

if: 判断条件是boolean类型的;
switch: 判断条件是 整数表达式 == int类型的值

发现switch只能适合对于整数的值做判断,如果是其他类型的判断,只能使用if语句;
选择: 如果是对整数表达式判断等于多少,首选使用switch,其他情况使用if语句;

三.循环结构

循环语句:

  • 1.while语句
  • 2.do while语句
  • for语句

三种,可以完成相同的功能;
仅仅只是语法上有些差异;

1.while循环

格式:

while(boolean表达式){
    循环体
}

while循环特点: 先判断表达式,若为true就执行循环体,否则,跳过循环体;

案例(1):

// 案例(1): 打印500次"你好"
int count = 0;
while(count < 500){
    System.out.println("你好");
    count ++;
}
System.out.println("ending......");

案例(2):

// 案例(3): 计算100以内的正整数之和
int number = 1;
int result = 0;

while(number <= 100){
    result += number;
    number ++;
}
System.out.println("100以内的正整数之和为: " + result);
2.do while循环

格式:

do{
    循环体语句
}while(boolean表达式);

重点: do while循环的特点: 先执行一次循环体,再判断表达式,若为true就执行循环体,否则就跳过循环体;也就是说do while是先执行后判断,即使判断条件为false,该循环至少会循环一次;

3.for循环

格式:

for(初始化语句;boolean表达式;循环后操作语句){
    循环体语句
}

初始化语句: 表示对循环进行初始化,只在循环开始时执行一次,定义一个变量,并赋值;
boolean表达式: 表达式为false时,循环终止,为true时,才会执行循环体;
循环后操作语句: 循环每次迭代之后会调用该语句,一般的该语句都是递增或递减操作;

注意: 一般在for循环的循环迭代变量起名规则:见过最多的循环变量名称: i,j,k,m,n;

案例:

// 案例(1): 打印500次你好
int number = 1;
for(int i = 0;i < 500;i ++){
    System.out.println("你好");
}

// 案例(2): 从1数到100,打印1~100
for(int i = 1;i <= 100;i ++){
    System.out.println("100以内的正整数之和为: " + i);
}

// 案例(3): 计算100以内的正整数之和
int result = 0;// 结果之和
for(int num = 1;num <= 100;num ++){
    result += num;// result = result + num;
}
System.out.println("100以内的正整数之和为: " + result);
4.死循环和循环语句对比

结构:

//while死循环
while(true){
    System.out.println("你好");
}

// do while死循环
do{
    System.out.println("你好");
}while(true);

// for死循环
for(;;){
    System.out.println("你好");
}

循环语句都一样,仅仅是语法结构可以上不一样吗而已;

提示:
三大循环,可以互换的,一般情况下,要是指定值次数的循环,选用for循环要方便点;一般习惯上选择i,j,k作为循环的变量;

从性能上分析: for循环性能更高;
因为: 变量定义在for循环里面,for循环执行完毕,就会释放该变量的存储空间;

5.嵌套循环

若外循环的循环次数是m次,内循环的循环次数是n次,那么内层循环的循环次数需要m*n次;

嵌套循环注意:

  • 1.使用循环嵌套时,内层循环和外层循环的循环控制变量不能相同;
  • 2.循环嵌套结构的书写,最好采用”右缩进”格式,以体现循环层次的关系;
  • 3.尽量避免太多和太深的循环嵌套结构;

循环解决的是: 某一个操作重复执行;

  • 如果一个重复的操作需要做N次,
  • 此时得使用嵌套循环;
  • 可以把内循环看做是一个整体;

示例:

// 从1数到100,打印1~100 并重复4次
for(int num = 1;num <= 4;num ++){
    for(int i = 1;i <= 100;i ++){
        System.out.println("i = " + i);
    }
}
6.嵌套循环性能优化案例

案例描述:
请对以下的代码进行优化

for (int i = 0; i < 1000; i++)  
    for (int j = 0; j < 100; j++)  
        for (int k = 0; k < 10; k++)  
            testFunction (i, j, k);  

案例分析:
从上述代码案例可以看出,不论如何优化,testFunction()执行的次数都是相同的,该部分是不存在优化的可能。那么优化只能从循环变量i,j,k的实例化、初始化、比较、自增等耗时方面来进行分析。首先分析代码循环变量在以上方面的耗时情况:

变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i1110001000
j100010001000*1001000*100
k1000*1001000*1001000*100*101000*100*10

目的:该代码性能优化就是要尽可能地减少循环变量i、j、k的实例化、初始化、比较、自增的次数,同时不引起其他可能的耗时运算。

解决过程:

优化方案①:

for (int i = 0; i < 10; i++)  
    for (int j = 0; j < 100; j++)  
        for (int k = 0; k < 1000; k++)  
            testFunction (k, j, i);  

该方案主要是将循环次数少的放在外面,循环次数多的放在里层,这样可以最大程度地减少相关循环变量的实例化次数、初始化次数等,方案耗时情况如下:

变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i11100100
j101010*10010*100
k10*10010*10010*100*100010*100*1000

优化方案②:

int i, j, k;  
for (i = 0; i < 10; i++)  
    for (j = 0; j < 100; j++)  
        for (k = 0; k < 1000; k++)  
            testFunction (k, j, i);  

该方案主要是在方案①的基础上,将循环变量的实例化放在循环外,这样可以进一步减少实例化次数,耗时情况如下表:

变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i111010
j11010*10010*100
k110*10010*100*100010*100*1000

注:方案②的优势体现在若将i、j、k的数值提高更多的,其提升的效果才更明显。

7.嵌套循环案例
1).输出矩形和三角形图案

输出矩形:

// 第一次输出(第一版)
System.out.println("*****");
System.out.println("*****");
System.out.println("*****");

// 第二次输出(第二版)
//第一行
for(int i = 1;i <= 5;i ++){
    System.out.print("*");
}
System.out.println();// 换行
//第二行
for(int i = 1;i <= 5;i ++){
    System.out.print("*");
}
System.out.println();// 换行
//第三行
for(int i = 1;i <= 5;i ++){
    System.out.print("*");
}
System.out.println();// 换行

// 第三次输出(最终版)
for(int line = 1;line <= 3;line ++){
    for(int i = 1;i <= 5;i ++){
        System.out.print("*");
    }
    System.out.println();// 换行
}

输出三角形图案:

// 第一次输出(第一版)
// 第1行
System.out.println("*");
// 第2行
System.out.println("**");
// 第3行
System.out.println("***");

// 第二次输出(第二版)
//第1行
for(int i = 1;i <= 1;i ++){// i <= 1
    System.out.print("*");
}
System.out.println();// 换行
//第2行
for(int i = 1;i <= 2;i ++){// i <= 2
    System.out.print("*");
}
System.out.println();// 换行
//第3行
for(int i = 1;i <= 3;i ++){// i <= 3
    System.out.print("*");
}
System.out.println();// 换行

// 第三次输出(第三版)
int line = 1;
//第1行
for(int i = 1;i <= line;i ++){// i <= line >> 1
    System.out.print("*");
}
System.out.println();// 换行
line++;
//第2行
for(int i = 1;i <= line;i ++){// i <= line >> 2
    System.out.print("*");
}
System.out.println();// 换行
line++;
//第3行
for(int i = 1;i <= line;i ++){// i <= line >> 3
    System.out.print("*");
}
System.out.println();// 换行
line++;

// 第四次输出(最终版)
for(int line = 1;line <= 3;line ++){
    for(int i = 1;i <= line;i ++){
        System.out.print("*");
    }
    System.out.println();// 换行
}
2).输出九九乘法口诀表
// 第一次输出(第一版)
System.out.println("1 * 1 = 1");
System.out.println("1 * 2 = 2 2 * 2 = 4");
System.out.println("1 * 3 = 3 2 * 3 = 6 3 * 3 = 9");

// 第二次输出(第二版)
//规律: 第二个乘数和行数相同,第一个乘数<=第二个乘数
//第1行
int line = 1;// 第二个乘数

for(int i = 1;i <= line;i ++){// i表示第一乘数
    System.out.print(i + " * " + line + " = " + (i * line) + "\t");
}
System.out.println();// 换行
line++;
//第2行
for(int i = 1;i <= line;i ++){// i表示第一乘数
    System.out.print(i + " * " + line + " = " + (i * line) + "\t");
}
System.out.println();// 换行
line++;
//第3行
for(int i = 1;i <= line;i ++){// i表示第一乘数
    System.out.print(i + " * " + line + " = " + (i * line) + "\t");
}
System.out.println();// 换行
line++;

// 第三次输出(最终版)
for(int line = 1;line <= 9;line ++){
    for(int i = 1;i <= line;i ++){// i表示第一乘数
        System.out.print(i + " * " + line + " = " + (i * line) + "\t");
    }
    System.out.println();// 换行
}

四.控制循环结构语句

1.break语句

break语句: 终止当前所在的循环;

注意: break之后的语句执行不了,所以不能编写,编写后会报错;

示例:

// 从1输出到10
for(int i = 1;i <= 10;i ++){
    // 如果输出7,则终止循环
    if(i == 7){
        break;// 跳出循环/循环终止
    }
    System.out.println(i);
}
System.out.println("ending...");

// 输出结果
1
2
3
4
5
6
ending...
2.continue语句

continue语句: 跳过当前的循环,进入下一次循环操作;

示例:

// 从1输出到10
for(int i = 1;i <= 10;i ++){
    // 如果输出4,则跳过当前的循环
    if(i == 4){
        continue;// 跳过当前的循环,进入下一次循环;
        System.out.println("------");// 当前的循环体之后的语句不再执行;永远也无法被执行的语句(编译器会报错)
    }
    System.out.println(i);
}
System.out.println("ending...");
3.return语句

表示结束循环所在的方法,方法都结束了,循环结构自然也就结束了;

注意: break,continue,return后面的语句永远也没有机会执行到,所以不能再跟任何语句,否则编译失败;

break和return都能结束当前的循环:如果循环之后的操作还得执行,那就使用break;

示例:

for(int i = 1;i <= 10;i ++){
    if(i == 7){
        return;// 结束所在的方法
    }
    System.out.println(i);
}
System.out.println("ending...");// 这个不会被执行
4.控制外层循环

要控制外层循环,就要使用标签,标签就是给某一个循环起一个别名,不过该别名得满足标识符的规范;

若要控制外层循环,就在break和continue后面跟上循环的别名就可以了;

如:

break <标签名>;

示例:

//使用标签控制外层循环
outter : for(int line = 1;line <= 9;line ++){
    for(int i = 1;i <= line;i ++){
        if(line == 5){
            break outter;// 控制外层循环
        }
        System.out.print(i + " * " + line + " = " + (i * line) + "\t");
    }
    System.out.println();
}
反馈与建议

感谢你阅读这篇博客。如果您喜欢这篇博客就请关注我和朋友一起分享吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值