switch多选择结构
多选择结构还有一个实现方式就是switch case语句
switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
switch语句中的变量类型可以是:
1.byte、short、int或者char
2.从javaSE7开始,switch支持字符串String类型了
3.同时case标签必须为字符串常量或字面量。
语法格式如下:
switch(expression){
case value:
//语句
break;
case value:
//语句
break;
//你可以有任意数量的case语句
default://可选
//语句
}
switch代码里面char的引用格式如下:
package com.rgf.structure;
import java.util.Scanner;
public class F {
public static void main(String[] args) {
//case穿透,switch匹配一个具体的值
Scanner scanner=new Scanner(System.in);
System.out.println("请输入您的成绩级别:");
char score = scanner.next().charAt(0);//scanner引用字符的方式
switch (score){
case 'A':
System.out.println("优秀");
break;//可选
case 'B':
System.out.println("良好");
break;//可选
case 'C':
System.out.println("及格");
break;//可选
case 'D':
System.out.println("不及格");
break;//可选
default:
System.out.println("未知等级");
break;
}
}
}
运行界面如下:
switch代码里面string的引用格式如下:
package com.rgf.structure;
import java.util.Scanner;
public class G {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的名字:");
String name = scanner.next();
//JDK的新特性,表达式结果可以是字符串!!!
//字符的本质还是数字。
//反编译 Java文件编译后生成class文件(字节码文件),
// 字节码文件我们看不懂,为了能看懂,我们需要反编译,
//反编译成我们的java程序或一些东西(工具例如IDEA)
switch (name) {
case "ypl":
System.out.println("ypl");
break;
case "rgf":
System.out.println("rgf");
break;
default:
System.out.println("名字不匹配");
break;
}
}
}
运行界面如下:
switch用法如下所示:
package com.hy;
import java.lang.Math;
import java.util.Scanner;
import java.lang.String;
/*
说明:
1.根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,则进入相应case结构中,调用其执行语句
当调用完执行语句后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止。
2.break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构。
3.switch结构中的表达式,只能是如下的6种数据类型之一:
byte、short、char、int、枚举类型(JDK5.0)、String类型(JDK7.0)
4.case之后只能声明常量,不能声明范围
5.break关键字是可选的。
6.default:相当于if-else结构中的else,default结构是可选的,而且位置是灵活的。
*/
public class Array8_ {
public static void main(String[] args) {
int a=5;
switch (a){
default:
System.out.println("other");
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
}
}
}
运行之后如下所示:
我们将代码修改如下:
package com.hy;
import java.lang.Math;
import java.util.Scanner;
import java.lang.String;
/*
说明:
1.根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,则进入相应case结构中,调用其执行语句
当调用完执行语句后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止。
2.break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构。
3.switch结构中的表达式,只能是如下的6种数据类型之一:
byte、short、char、int、枚举类型(JDK5.0)、String类型(JDK7.0)
4.case之后只能声明常量,不能声明范围
5.break关键字是可选的。
6.default:相当于if-else结构中的else,default结构是可选的,而且位置是灵活的。
*/
public class Array8_ {
public static void main(String[] args) {
int a=5;
switch (a){
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
default:
System.out.println("other");
}
}
}
运行之后如下所示:
switch测试题如下所示:
1.使用switch把小写类型的char型转为大写,只转换a,b,c,d,e,其他的输出“other"
package com.hy;
import java.lang.Math;
import java.util.Scanner;
import java.lang.String;
public class Array8_ {
public static void main(String[] args) {
//1.使用switch把小写类型的char型转为大写,只转换a,b,c,d,e,其他的输出“other"
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要转换的字母:");
String word = scanner.next();
char c = word.charAt(0);
switch (c){
case 'a':
System.out.println('A');
break;
case 'b':
System.out.println('B');
break;
case 'c':
System.out.println('C');
break;
case 'd':
System.out.println('D');
break;
case 'e':
System.out.println('E');
break;
default:
System.out.println("other");
}
}
}
运行之后如下所示:
2.对学生成绩大于60分的,输出”合格“,低于60分的,输出”不合格“。
package com.hy;
import java.lang.Math;
import java.util.Scanner;
import java.lang.String;
public class Array8_ {
public static void main(String[] args) {
//2.对学生成绩大于60分的,输出”合格“,低于60分的,输出”不合格“。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生成绩:");
int grade = scanner.nextInt();
switch (grade/10){
case 0:
System.out.println("不及格");
break;
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;
case 8:
System.out.println("及格");
break;
case 9:
System.out.println("及格");
break;
case 10:
System.out.println("及格");
break;
}
}
}
运行之后如下所示:
我们相同的可以删掉,优化如下:
package com.hy;
import java.lang.Math;
import java.util.Scanner;
import java.lang.String;
public class Array8_ {
public static void main(String[] args) {
//2.对学生成绩大于60分的,输出”合格“,低于60分的,输出”不合格“。
//说明:如果switch-case 结构中的多个case的执行语句相同,则可以考虑进行合并。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生成绩:");
int grade = scanner.nextInt();
switch (grade/10){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("不及格");
break;
case 6:
case 7:
case 8:
case 9:
case 10:
System.out.println("及格");
break;
}
}
}
运行之后如下所示:
3.根据用于指定月份,打印该月份所属的季节。
3,4,5 春季 6,7,8夏季 9,10,11秋季 12,1,2冬季。
package com.ypl.data_;
import java.sql.Date;
import java.time.Instant;
import java.util.Scanner;
public class Instant_ {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入月份:");
int i = scanner.nextInt();
switch (i){
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;
case 12:
case 1:
case 2:
System.out.println("冬季");
break;
}
}
}
我们运行之后如下所示:
4.编写程序:从键盘上输入2019年的“month"和”day",要求通过程序输出输入的日期为2019年的第几天。
package com.ypl.data_;
import java.util.Scanner;
/*.编写程序:从键盘上输入2023年的”month"和“day",要求通过程序输出输入的日期为2023年的第几天.
*/
public class LocalDate1_ {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入2023年的month:");
int month = scanner.nextInt();
System.out.println("请输入2023年的day:");
int day = scanner.nextInt();
//定义一个变量来保存总天数
int sumDays=0;
if(month==1){
sumDays=day;
System.out.println("是第"+sumDays+"天");
} else if (month==2) {
sumDays=31+day;
System.out.println("是第"+sumDays+"天");
} else if (month==3) {
sumDays=31+28+day;
System.out.println("是第"+sumDays+"天");
}else if (month==4){
sumDays=31+28+31+day;
System.out.println("是第"+sumDays+"天");
} else if (month==5) {
sumDays=31+28+30+30+day;
System.out.println("是第"+sumDays+"天");
}else if(month==6){
sumDays=31+28+30+30+31+day;
System.out.println("是第"+sumDays+"天");
} else if (month==7) {
sumDays=31+28+30+30+31+30+day;
System.out.println("是第"+sumDays+"天");
} else if (month==8) {
sumDays=31+28+30+30+31+30+31+day;
System.out.println("是第"+sumDays+"天");
} else if (month==9) {
sumDays=31+28+30+30+31+30+31+31+day;
System.out.println("是第"+sumDays+"天");
} else if (month==10) {
sumDays=31+28+30+30+31+30+31+31+30+day;
System.out.println("是第"+sumDays+"天");
} else if (month==11) {
sumDays=31+28+30+30+31+30+31+31+30+31+day;
System.out.println("是第"+sumDays+"天");
} else if (month==12) {
sumDays=31+28+30+30+31+30+31+31+30+31+31+day ;
System.out.println("是第"+sumDays+"天");
}
}
}
运行之后如下所示:
我们发现代码里面重复的比较多,出现了冗余。我们来进行优化如下所示:
我们采用switch-case方法来进行如下所示:
package com.ypl.exercise;
import java.util.Scanner;
public class Homework01 {
public static void main(String[] args) {
/*.编写程序:从键盘上输入2023年的”month"和“day",要求通过程序输出输入的日期为2023年的第几天
*/
//更优的解决方案
Scanner scanner = new Scanner(System.in);
System.out.println("请输入月份:");
int month = scanner.nextInt();
System.out.println("请输入天:");
int day = scanner.nextInt();
//定义一个变量来保存总天数
int sumDays=0;
switch (month){
case 1:
sumDays=day;
break;
case 2:
sumDays=31+day;
break;
case 3:
sumDays=31+28+day;
break;
case 4:
sumDays=31+28+31+day;
break;
case 5:
sumDays=31+28+30+30+day;
break;
case 6:
sumDays=31+28+30+30+31+day;
break;
case 7:
sumDays=31+28+30+30+31+30+day;
break;
case 8:
sumDays=31+28+30+30+31+30+31+day;
break;
case 9:
sumDays=31+28+30+30+31+30+31+31+day;
break;
case 10:
sumDays=31+28+30+30+31+30+31+31+30+day;
break;
case 11:
sumDays=31+28+30+30+31+30+31+31+30+31+day;
break;
case 12:
sumDays=31+28+30+30+31+30+31+31+30+31+31+day;
break;
}
System.out.println("2023年的第"+sumDays+"天");
}
}
我们运行之后如下所示:
我们发现上述方式和if-else同样都很麻烦,我们继续进行优化。尽可能的减少冗余。
package com.ypl.exercise;
import java.util.Scanner;
public class Homework01 {
public static void main(String[] args) {
/*.编写程序:从键盘上输入2023年的”month"和“day",要求通过程序输出输入的日期为2023年的第几天
说明:break在switch-case当中是可选的。
*/
//更优的解决方案
Scanner scanner = new Scanner(System.in);
System.out.println("请输入月份:");
int month = scanner.nextInt();
System.out.println("请输入天:");
int day = scanner.nextInt();
//定义一个变量来保存总天数
int sumDays=0;
switch (month){
case 12:
sumDays+=30;
case 11:
sumDays+=31;
case 10:
sumDays+=30;
case 9:
sumDays+=31;
case 8:
sumDays+=31;
case 7:
sumDays+=30;
case 6:
sumDays+=31;//我们输入6月,从上往下将5,4,3,2,1月的都加上之后,最后再将当月的月数加上即可。
case 5:
sumDays+=30;
case 4:
sumDays+=31;
case 3:
sumDays+=28;
case 2:
sumDays+=31;
case 1:
sumDays+=day;;
}
System.out.println("2023年"+month+"月"+day+"日是当年的第"+sumDays+"天");
}
}
运行之后如下所示:
5.从键盘分别输入年、月、日,判断这一天是当年的第几天
注:判断一年是否是闰年的标准:
(1)可以被4整除,但不可被100整除或(2)可以被400整除。
package com.ypl.exercise;
import java.util.Scanner;
public class W {
public static void main(String[] args) {
/*
5.从键盘分别输入年、月、日,判断这一天是当年的第几天
注:判断一年是否是闰年的标准:
(1)可以被4整除,但不可被100整除或
(2)可以被400整除。
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年份:");
int year = scanner.nextInt();
System.out.println("请输入月份:");
int month = scanner.nextInt();
System.out.println("请输入日:");
int day = scanner.nextInt();
//定义一个变量来保存总天数
int sumDays=0;
switch (month){
case 12:
sumDays+=30;
case 11:
sumDays+=31;
case 10:
sumDays+=30;
case 9:
sumDays+=31;
case 8:
sumDays+=31;
case 7:
sumDays+=30;
case 6:
sumDays+=31;//我们输入6月,从上往下将5,4,3,2,1月的都加上之后,最后再将当月的月数加上即可。
case 5:
sumDays+=30;
case 4:
sumDays+=31;
case 3:
//判断year是否是闰年
if((year%4 == 0 && year%100 != 0)||(year%400==0)) {
sumDays += 29;
}else {
sumDays += 28;
}
case 2:
sumDays+=31;
case 1:
sumDays+=day;;
}
System.out.println(year+"年"+month+"月"+day+"日是当年的第"+sumDays+"天");
}
}
运行之后如下所示:(闰年)
我们继续运行之后如下所示:
switch-case与if-else的转换:
(1)凡是可以使用switch-case的结构,都可以转换为if-else,反之,不成立。
(2)当我们写分支结构时,当发现既可以使用switch-case时,(同时,switch中表达式的取值情况不太多),又可以使用if-else时,我们优先选择使用switch-case.。原因:switch-case执行效率稍高!
1.使用switch语句改写下列if语句:
package com.ypl.exercise; public class A { public static void main(String[] args) { int a = 3; int x = 100; if (a == 1) x += 5; else if (a == 2) { x += 10; } else if (a == 3) { x += 16; } else { x += 34; } } }
改写后如下所示:
package com.ypl.exercise; public class A { public static void main(String[] args) { int a = 3; int x = 100; switch (a){ case 1: x+=5; break; case 2: x+=10; break; case 3: x+=16; break; default: x+=34; } System.out.println(x); } }
运行之后如下所示:
2.编写程序:从键盘上读入一个学生成绩,存放在变量score中,根据score的值输出其对应的成绩等级:
score>=90 等级:A
70<=score<90 等级:B
60<=score<70 等级:C
score<60 等级:D
使用if-else的代码如下所示:
package com.ypl.exercise; import java.util.Scanner; public class C { public static void main(String[] args) { /* .编写程序:从键盘上读入一个学生成绩,存放在变量score中,根据score的值输出其对应的成绩等级: score>=90 等级:A 70<=score<90 等级:B 60<=score<70 等级:C score<60 等级:D 使用if-else的代码如下所示: */ Scanner scanner = new Scanner(System.in); System.out.println("请输入学生成绩:"); int score = scanner.nextInt(); if(score>=90){ System.out.println("等级:A"); } else if (70<=score&& score<90) { System.out.println("等级:B"); } else if (60<=score && score<70) { System.out.println("等级:C"); }else { System.out.println("等级D"); } } }
运行之后如下所示:
我们使用switch如下所示:
package com.ypl.exercise; import java.util.Scanner; public class C { public static void main(String[] args) { /* .编写程序:从键盘上读入一个学生成绩,存放在变量score中,根据score的值输出其对应的成绩等级: score>=90 等级:A 70<=score<90 等级:B 60<=score<70 等级:C score<60 等级:D 使用if-else的代码如下所示: */ Scanner scanner = new Scanner(System.in); System.out.println("请输入学生成绩:"); int score = scanner.nextInt(); switch (score/10){ case 1: case 2: case 3: case 4: case 5: case 6: if(score<60){ System.out.println("等级D"); }else if(score==60) { System.out.println("等级C"); } break; case 7: if(score<70){ System.out.println("等级C"); } else if (score==70) { System.out.println("等级B"); } break; case 8: case 9: if(score<90){ System.out.println("等级B"); } else if (score==90) { System.out.println("等级A"); } break; case 10: System.out.println("等级A"); break; } } }
运行之后如下所示:
反编译的流程如下:
1.点击IDEA里面的Project Structure
2.进去之后,我们点击Project,同时复制最下面的文件路径进行搜索.
3.复制到文件搜索位置进行搜索
4.我们点击之后发现该class文件。
5.将class文件打开之后发现如下所示,无法看懂。
看不懂该文件,所以我们需要进行反编译。
我们直接复制该文件到structure包下的时候,我们发现:
发现无法直接拷贝,这个时候,我们可以通过直接搜索文件夹进行拖拽即可,如下所示:
点击包名,点击右键,找到open in,点击explorer.
找到如下目录,将class文件进行拖拽到里面即可
然后我们打开IDEA,发现在该包下面有这个class文件了,打开即可。
即反编译成功:
其中名字里面加了个name.hashCode,每个对象都有一个自己的hashCode,它是通过一些特定的算法生成的,而我们的名字,还有中文都有一个自己对应的哈希值,也可以直接把该class文件扔到IDEA里面。