一.顺序结构
如果代码里没有流程控制,程序是按照书写的格式从上而下一行一行执行的;一条语句执行完后继续执行下一条语句,中间没有判断和跳转,直到程序结束;
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");
}
}
二.选择结构
如果使用程序描述”如果今天是周一,就上班;如果今天是周二就逛街;如果今天是周三就去公园……..”;显然使用顺序结构是搞不定的;
因为此时程序具有多个条件,需要通过条件判断来决定程序具体做什么,那该如何呢?
通过判断条件来做选择的语句,我们称为选择语句或分支语句;选择结构有两种分别是if和switch;
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的实例化、初始化、比较、自增等耗时方面来进行分析。首先分析代码循环变量在以上方面的耗时情况:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
---|---|---|---|---|
i | 1 | 1 | 1000 | 1000 |
j | 1000 | 1000 | 1000*100 | 1000*100 |
k | 1000*100 | 1000*100 | 1000*100*10 | 1000*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);
该方案主要是将循环次数少的放在外面,循环次数多的放在里层,这样可以最大程度地减少相关循环变量的实例化次数、初始化次数等,方案耗时情况如下:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
---|---|---|---|---|
i | 1 | 1 | 100 | 100 |
j | 10 | 10 | 10*100 | 10*100 |
k | 10*100 | 10*100 | 10*100*1000 | 10*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);
该方案主要是在方案①的基础上,将循环变量的实例化放在循环外,这样可以进一步减少实例化次数,耗时情况如下表:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
---|---|---|---|---|
i | 1 | 1 | 10 | 10 |
j | 1 | 10 | 10*100 | 10*100 |
k | 1 | 10*100 | 10*100*1000 | 10*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();
}
反馈与建议
- 博客:我的优快云博客
- 邮箱:pengtdy@gmail.com
- QQ交流群:644402856(新)
感谢你阅读这篇博客。如果您喜欢这篇博客就请关注我和朋友一起分享吧!