流程控制语句
java中的语句结构
顺序结构:从上到下依次执行
选择结构|分支结构:满足条件才会去执行对应的代码
循环结构:重复的执行一些代码
选择结构
if语句
switch语句
if语句
单选泽|单分支
if(表达式){
语句体;
}
执行流程:
1.计算表达式,得到一个boolean结果
2.如果结果为true,执行{}中的语句体
3.如果结果为false,就不执行直接跳过if结构
双选择|双分支
if(表达式1){
语句体1;
}else{
语句体2;
}
执行流程:
1.计算表达式1,得到一个boolean结果
2.如果结果为true,执行{}中的语句体1
3.如果结果为false,执行{}中的语句体2
多选择|多分支
if(表达式1){
语句体1;
}else if(表达式2){
语句体2;
}else if(表达式3){
语句体3;
}....
else{
如果以上的if条件都不满足就执行这个语句体n
}
注意:
使用多选择与多个单选择之间区别 : 1)语义化结构 2)执行判断次数 3)执行语句体次数
当{}中的语句体只有一句时候,前后的{}可以省略
public class Demo{
public static void main(String[] args){
int a=5,b=10;
if(a>b){
System.out.println("a比b大");
}else if(a==b){
System.out.println("a等于b");
}else{
System.out.println("a比b小");
}
}
}
switch定值判断
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
....
default: --> 接盘侠
语句体n;
break;
}
表达式 : 一般为一个 变量或者一个表达式
表达式的类型: byte,short,int,char,枚举(jdk5新增),String(jdk7)
case : 后面接一个定值【byte,short,int,char,枚举(jdk5新增),String(jdk7)】,不能是区间,使用定值与表达式的结果进行判断,相等执行后面对应的语句体,不相等继续向下判断。判断boolean类型的数值可以将boolean类型的数值用其他类型数值代替,例如true使用int类型的0代替,例如false使用int类型的1代替。
break : 结束switch语句
防止case穿透问题,如果没有break;,那么执行完当前分支后会顺序执行该分支下的语句
default : 默认的
如果以上的case后的值与表达式的结果都不相等时候,执行default后的代码
位置可变,可以在switch语句{}的任意位置
if与switch与条件运算符之间的区别:
条件运算符: 根据条件做判断 运算符 结构简单,受限制->判断条件单一,直接根据判断条件获取结果,肯定会得到一个结果
结构复杂使用if或者switch
if-> 定值判断,区间判断
switch->定值判断
能用switch的都能if,能用if不一定能用switch
建议: 简单合适结构可以条件运算符,复杂的,定值的可以使用switch->都可以使用if
public class Demo{
public static void main(String[] args){
int a = 5,b = 10;
switch(a){ //switch()括号里面的变量类型可以是byte,short,int,char,枚举(jdk5新增),String(jdk7)
case 5 :
System.out.println("我是a"); //变量a的值为5所以会输出我是a
break;
case 10 :
System.out.println("我是b");
break;
default:
System.out.println("无");
break;
}
}
}
循环结构
控制一些代码重复执行多次
for循环
while循环
do…while循环
for循环
次数循环,确定区间范围,确定变量变化的情况,进一步确定要循环的次数
for(条件初始化;条件判断;条件变化){
重复执行的语句;
}
条件初始化: 声明一个变量并且第一次赋值 i
条件判断 : 对变量i的值的判断->结果为boolean的值
条件变化 : 变量i自身值的改变
执行流程:
1.条件初始化,得到一个变量i
2.条件判断的结果->boolean
3.true->执行{}中的代码->false结束循环
4.条件变化
重复执行第2,3,4步骤
public class Demo{
public static void main(String[] args){
int sum = 0;
for(int i = 1;i<=100;i++){ //for()中声明的变量只在for循环中有效,当i>100时结束循环
sum += i;
}
System.out.println("1-100的和为:"+sum);
}
}
//return:必须放在方法中
//return的主要作用有两点:
//1.返回方法指定类型值
//2.用于方法结束的标志,return 后面的语句不会被执行
public class Test001 {
public static void main(String[] args) {
int i;
System.out.println("return语句之前"+getInfo());
for (i = 0; i < 5; i++) {
if(i==3){
return;//无返回类型,用于方法的结束
}
System.out.println(String.format("i=%d",i));
}
//return 之后的语句将不会被执行
System.out.println("return语句之后"+getInfo());
}
public static int getInfo(){
return 1;//有返回类型,返回方法指定类型的返回值
}}
注意:
循环结构中,如果{}中的语句体只有一句,前后的{}可以省略
循环体重可以使用循环的条件变量i,可以不使用
for循环是循环结构中最常用的循环结构
for(;;){
//死循环,条件一直为true
}
while循环
while 条件循环
条件初始化;
while(条件判断){
重复执行的语句体;
条件变化;
}
注意 : 循环之间都可以相互转换
public class Demo{
public static void main(String[] args){
int i = 1,sum = 0; //while循环需要先在循环外声明好参与循环的变量
while(i<=100){
sum += i;
i++;
}
System.out.println("i的值为"+i);
System.out.println("1-100的和为:"+sum);
}
}
while(true){
//死循环,条件一直为true
}
总结
for( ; ; ) 比 while(true) 好
原因:(底层完全不同)
“死循环”有两种写法:for(;;)和while(true),两者有啥区别,为啥源码中多数是for( ; ; )这种形式的,
编译前 | 编译后 |
---|---|
while (1); | mov eax,1 |
test eax,eax | |
je foo+23h | |
jmp foo+18h | |
编译前 | 编译后 |
for (;;); | jmp foo+23h |
对比之下,for (;;)指令少,不占用寄存器,而且没有判断跳转,比while (1)好。
也就是说两者在在宏观上完全一样的逻辑,但是底层完全不一样,for相对于来说更加简洁明了
do…while循环
条件初始化;
do{
重复执行的语句;
条件变化;
}while(判断条件);
do…while与while之间的区别就是:
do…while无论是否满足条件都至少执行一次
while满足条件执行不满足不执行
注意:
在使用while或者do…while循环的时候,不要丢掉条件变化
public class Demo{
public static void main(String[] args){
int i = 1,sum = 0; //do...while循环需要先在方法中声明好参与循环的变量
do{
sum += i;
i++;
}while(i<=100);
System.out.println("i的值为"+i); //do...while和while循环的区别为,do...while不管条件满足还是不满足至少会执行一次
System.out.println("1-100的和为:"+sum);
}
}
break和continue
break与continue
break:
作用 : 终止 结束
应用场景 : switch语句 循环中
continue :
作用 : 跳过当前这一次循环,直接进入到下一次循环
应用场景 : 循环中
public class Demo{
public static void main(String[] args){
int sum = 0;
for(int i=1;i<=3;i++){
if(i==1){
break;
}
sum++;
}
System.out.println("for循环中加break:"+sum);
sum = 0; //初始化sum
for(int i=1;i<=3;i++){
if(i==1){
continue; //当i等于1的时候跳过此次循环,本次不在执行continue;语句后for循环中的语句
}
sum++;
}
System.out.println("for循环中加continue:"+sum);
sum = 0;
switch(sum){
case 0 :
System.out.println("这是第一个选项"); //当case中没有break;时,会发生case穿透,程序会继续执行下一个case中的代码
case 1 :
System.out.println("这是第二个选项");
break; //当遇到break;时,会停止switch中代码的执行,结束switch选择
case 2 :
System.out.println("这是第三个选项");
break;
default:
System.out.println("这是第缺省选项");
break;
}
}
}