swtich语句
switch格式
1.小括号()中数据值的数据类型
- 原则上只支持int类型,但是考虑到自动类型提升。所以也支持 byte,short,char
- jdk5.0以后,支持枚举类型Enum
- jdk7.0以后,支持字符串类型String
switch(数据值){
case 数据值1:
语句体
break;
case 数据值2:
语句体2
break;
default:
语句体n+1
break;
}
2.default的位置可以与case互换,不影响。推荐写在最后。
3.default 也可以不写,推荐写
case穿透
分支当中没有break的话,直接进入下一个分支执行。叫做case穿透现象
根据指定的月份输出对应季节 ,缓存穿透还还能这么用。
int month=7;
switch(month) {
case 1: case 2: case 12:
System.out.println("冬季");
break;
case 3: case 4: case 5:
System.out.println("春季");
break;
case 6: case 7: case 8:
System.out.println("夏季");
break;
case 9: case 10: case 11:
System.out.println("秋季");
break;
default:
System.out.println("你输入的月份有误");
break;
}
------------------------------------------------
不写break导致的case穿透--老坑了
int num=3; switch(num){ case 1: System.out.println("你好"); case 2: System.out.println("我好"); case 3: System.out.println("大家好"); default: System.out.println("他好我也好"); }
运行结果,2次验证结果就是这样的【22-08-05回看】
-----------------------------------------------------
case穿透--更换default位置,走其中一个case
int num=2; switch(num){ case 1: System.out.println("你好"); case 2: System.out.println("我好"); default: System.out.println("他好我也好"); case 3: System.out.println("大家好"); }
运行结果:感觉不写break以后就成了顺序结构。一溜执行
case穿透,-更换default位置,要是走default
int num=4; switch(num){ case 1: System.out.println("你好"); case 2: System.out.println("我好"); default: System.out.println("他好我也好"); case 3: System.out.println("大家好"); }
运行结果:
循环语句
循环结构: for语句
仔细体会,循环的执行顺序就像我画的这副灵魂画作一般
---------- 《---
- -
=
for(初始化语句;循环条件语句;迭代语句){
循环体语句
}
for (int i = 0; i < 10; i++) { System.out.println(i+"-> 你好啊"); }
for语句执行流程
先执行初始化语句;
循环条件语句为true->执行循环体语句->执行迭代语句->跳回循环语句条件判断
循环条件语句如果是false,for语句结束。
for循环打印水仙花数
每2个一换行,打印水仙花数并打印水仙花数的个数:
所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
* 举例:153就是一个水仙花数。 153 = 1*1*1 + 5*5*5 + 3*3*3
int count=0;
for(int x=100; x<1000; x++) {
//获取三位数的个位,十位,百位
int ge = x%10;
int shi = x/10%10;
int bai = x/10/10%10;
//数据筛选
if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == x) {
count++;
if(count%2==0){
System.out.println(x);
}else{
System.out.print(x+" ");
}
}
}
//输出统计结果就可以了
System.out.println("水仙花数共有:"+count+"个");
运行结果:
while循环语句
执行流程:循环条件为false,while循环语句结束
循环条件为true,执行循环体语句;再去判断循环条件
while(循环条件){
循环体语句
}例如之后会学到的流,在进行文件复制的代码
int len; while((len=fis.read(bytes))!=-1){ fos.write(bytes,0,len); }
为了和for语句互相转换,while衍生的扩展格式
初始化语句;
while(循环条件){
循环体语句
迭代语句
}
do...while语句
do...while感觉已经报废了,版本弃子【这里顺便提一下,因为可能看源码或者别人的代码用到】
do {
循环体语句
}while(循环条件语句);
执行流程:
1.先执行循环体语句。
2.循环条件判断是false,do...while结束
循环条件判断是true,再去执行循环体语句。
dowhile 衍生格式,,【我看都不想看了,这种版本弃子中的弃子,】
初始化语句
do {
循环体语句
迭代语句
}while(循环条件语句);
三种循环的区别
1. 循环变量作用域分析
for语句的循环变量i在循环结束自动消失,可节约内存。
while和dowhile的扩展格式的循环变量需要等到所在的方法结束后才消失,浪费内存资源
2.循环条件语句执行次数不同,打印10遍HelloWorld
for和while 11次判断,dowhile判断10次。
3.循环体语句最少的执行次数
for和while 最少0次,dowhile最少1次。
实际开发怎么选
1.有明显的循环范围或循环次数选择for遍历
2.不符合条件一的选择while
3.在实际开发中不会选择dowhile
循环延申
break、continue、return
break使用场景:
1.break中断switch语句。用来结束switch语句
2.break中断循环语句。如果是内部循环,则仅中断内部循环。
continue使用场景:
循环语句当中,结束当次循环,继续下一次循环 。一般 用于跳过指定条件下的循环体,如果循环是嵌套的,仅跳过当前循环在控制语句同一作用域内,break,continue后不能编写代码,会编译报错,因为永远执行不到
死循环
死循环要求:循环判断条件永远为true
实际开发,更推荐while死循环
//while死循环语句
while(true){
//循环体语句
}
但是在框架源码,算法,设计模式,更推荐for的死循环格式,因为for的死循环效率更高
//for死循环语句
for( ; ; ){
//循环体语句
}
for循环嵌套
不管咋样嵌套,始终记住单个for循环的执行流程。才不会迷糊
for(; ;){
for(; ;){
}
}
循环嵌套的经典案例,打印1-100所有质数
什么是质数呢
- 只能被1或本身进行整除
- 1不是质数
打印1-100质数,方式一:
//质数的因数只有2个,通过因数的个数判断
for(int i=2;i<=100 ;i++){
int count=0;
for(int j=1;j<=i ;j++){
if(i%j==0){
count++;
}
}
if(count==2){
System.out.println("质数"+i);
}
}
打印1-100质数,方式二:
22-08-05 回访,自己默写出来的是第二种方式
//打印1-100质数
for (int i = 1; i < 100; i++) {
boolean isZhiShu = true;
if (i == 1) {
continue;
}
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isZhiShu = false;
break;
}
}
//打印质数
if (isZhiShu) {
System.out.println("质数-》" + i);
}
}