呸,标题党
简单使用
switch的case语句可以处理int,short,byte,char类型的值,枚举类型(JDK1.5支持)String(JDK1.7支持),但是不能处理long、Double,等类型,因为short,byte,char都会转换成int进行处理,这一点也可以从生成的字节码看出。
@Test
public void test05(){
int i=0;
switch (i){
case 0:
System.out.println(1);
break;
case 1:
System.out.println(0);
break;
default:
System.out.println("default");
}
}
switch、break、default等关键字不在这里重复了,只提一点 case 标签必须为字符串常量或字面量。
性能使用
其实这个问题有点杠,对于if…else和switch的选择,一般情况下还是需要根据业务决定的,比如说if中的条件判断,不够生搬硬套到switch中,再比如根据条件判断是否执行某一段代码这种需求,总是要用到if…else的。性能方面分析下面这两种情况做一个说明:
- 如果需求明知道多数情况下会走第一个if后的语句
@Test
public void test06(){
if(true){
System.out.println(true);
}else{
System.out.println(false);
}
}
这种类型的判断大部分情况下走的是第一条语句,所有采用if的性能足够好,不行要在做判断。
- 多数情况下需要走多个判断才能找到结果
switch ("a"){
case "abc":
System.out.println("abc");
break;
case "ab":
System.out.println("ab");
break;
case "a":
System.out.println("a");
break;
default:
System.out.println("default");
}
这种情况下,如果采用if的判断方式,需要走过3步才能执行成功:==abc、==ab、==a,而对于switch语句,只需一步即可达到目的,由于采用的是Binary Tree算法,直接跳转,不需要逐个比较查询,这种方式类似于map的空间换时间
;
switch和if语句的区别
* 分支较多时,用switch的效率很高,不管有多少case,都直接跳转,不需逐个比较查询
* switch...case只能处理case为常量的情况,相对于if...else则灵活的多
* switch的效率与分支数无关。当只有分支比较少的时候,if效率比switch高(因为switch有跳转表)
阿里巴巴开发规范中提到的问题
#NullPointerException
具体原因见下图:
开头说的short,byte,char都会转换成int进行处理