在编写代码时,逻辑判断是避免不了的,switch case语句在很多编程语言中的功能都是用于条件判断,java中为多路分支选择流程专门提供了switch语句,switch语句根据一个表达式的值,选择运行多个操作中的一个。当需要对选项进行等值判断时,使用switch语句更加简洁明了。switch的case语句可以处理int,short,byte,char类型的值,但是不能处理long,string等类型。说起来你应该也会想到另一个常用的条件判断语句if else,本文重点介绍java中switch case语句的用法,但是会在篇末对两种语句的区别做一个总结。
switch(表达式){
case 表达式常量1:语句1;
break;
case 表达式常量2:语句2;
break;
......
case 表达式常量n:语句n;
break;
[default:语句n+1;]
}
public class switch {
public static void main(string[] args)
{
int x=0;
switch(x)
{
default:
system.out.println("default");
case 1:
system.out.println(1);
case 2:
system.out.println(2);
}
}
}
输出结果如下:
public class switch {
public static void main(string[] args) {
int x = 0;
switch (x) {
default:
system.out.println("default");
case 0:
system.out.println(0);
case 1:
system.out.println(1);
case 2:
system.out.println(2);
}
}
}
输出结果如下:public class switch {
public static void main(string[] args) {
int x = 0;
switch (x) {
case 0:
system.out.println(0);
case 1:
system.out.println(1);
case 2:
system.out.println(2);
default:
system.out.println("default");
}
}
}
输出结果如下:switch(a),括号中a的取值只能是整型或者可以转换为整型的数值类型,比如byte、short、int、char、还有枚举;需要强调的是:long和string类型是不能作用在switch语句上的。
case b:c;case是常量表达式,也就是说b的取值只能是常量(需要定义一个final型的常量,后面会详细介绍原因)或者int、byte、short、char(比如1、2、3、200000000000(注意了这是整型)),如果你需要在此处写一个表达式或者变量,那么就要加上单引号; case后的语句可以不用大括号,就是c不需要用大括号包裹着;
default就是如果没有符合的case就执行它,default并不是必须的。
案例分析:
1.标准型(case后面都有break语句,case后的值都是整数)
int i=3;
switch(i)
{
case 1:
system.out.println(1);
break;
case 2:
system.out.println(2);
break;
default:
system.out.println("default");
break;
}
2.常量型(case后面都有break语句,case后的值都是常量)
private final int num1=1;
private final int num2=1;
int i=3;
switch(i)
{
case num1:
system.out.println(1);
break;
case num2:
system.out.println(2);
break;
default:
system.out.println("default");
break;
}
3.表达式型(case后面都有break语句,case后的值都是表达式)
int i=3;
int b = 2;
switch(i)
{
case ‘类名.getid()‘:
system.out.println(1);
break;
case ‘b‘
system.out.println(2);
break;
default:
system.out.println("default");
break;
}
public class switchdemo {
public static void main(string[] args) {
int month = 8;
string monthstring;
switch (month) {
case 1: monthstring = "january";
break;
case 2: monthstring = "february";
break;
case 3: monthstring = "march";
break;
case 4: monthstring = "april";
break;
case 5: monthstring = "may";
break;
case 6: monthstring = "june";
break;
case 7: monthstring = "july";
break;
case 8: monthstring = "august";
break;
case 9: monthstring = "september";
break;
case 10: monthstring = "october";
break;
case 11: monthstring = "november";
break;
case 12: monthstring = "december";
break;
default: monthstring = "invalid month";
break;
}
system.out.println(monthstring);
}
}
switch和if-else相比,由于使用了binary tree算法,绝大部分情况下switch会快一点,除非是if-else的第一个条件就为true。
编译器编译switch与编译if...else...不同。不管有多少case,都直接跳转,不需逐个比较查询。
相比于if-else结构,switch的效率绝对是要高很多的,但是switch使用查找表的方式决定了case的条件必须是一个连续的常量。而if-else则可以灵活的多。
switch效率高,从汇编代码可以看出来。switch只计算一次值,然后都是test。
switch的效率与分支数无关。当只有分支比较少的时候,if效率比switch高(因为switch有跳转表)。分支比较多,那当然是使用switch。