switch...case 和 if...else

写代码的时候经常会遇到判断语句,毫不犹豫就会选择if...else,但每次写判断,也都会想起switch...case,总是会考虑,咦,这个if...else能不能用switch...case代替呢,不过每次还是写的if...else哈哈。

今天想来整理总结一下switch...case 和 if...else

switch...case 语句样例:

switch(num){
		case 1: ...; break;
		case 2: ...; break;
		case 3: ...; break;
		case 4: ...; break;
		default:...;break;
		}

if...else语句如下:

if(num == 1){
			...;
		}else if(num == 2){
			...;
		}else if(num == 3){
			...;
		}else if(num == 4){
			...;
		}

是不是更喜欢switch...case一些呢?哈哈,switch...case更简洁,优雅一些,可读性更强。效率上也会比if,,,else高一些,有一篇文章上面说,判断超过三次,switch的效率会比if的要高,如果是小于三次,还是建议用if...else

看起来switch...case 优点更多呢,其实未然,这里面有很多的限制以及注意事项:

1.switch(num) 后面的这个 num,是有类型限定的,只能是byte,short,char,int四种整形类型,枚举类型和java.lang.String类型(从java 7才允许),不能是boolean类型。

2.case 1:case是常量表达式,也就是说这里1的取值只能是常量(需要定义一个final型的常量且必须是编译时常量,即要对它进行初始化)或者int、byte、short、char,如果你需要在此处写一个表达式或者变量,那么就要加上单引号; case结束后,要加上break, switch的break语句虽然是可选的,但是一般情况下break是不能少的。否则可能会出现意料之外的错误。如果没有break,程序会继续执行后面的代码。

    case后面的值要保证唯一性。

3. default就是如果没有符合的case就执行它,default并不是必须的.相当于if...else中最后的else。

对于switch后面的类型,有人说还可以是 byte,short,char,int 的包装类,其实这并不正确,但如下代码 确实会输出 :”没错,就是我了“

switch(new Integer(22)){
		case(20):
			System.out.println("20");break;
		case(22):
			System.out.println("没错,就是我了");break;
			default:System.out.println("bye");break;
		}

这是为什么呢?switch之所以能够支持他们的包装类,是因为自动拆箱的原因(从JDK1.5开始支持自动拆箱和自动装箱,自动拆箱就是自动将引用数据类型转化为基本数据类型,自动装箱就是自动将基本数据类型转化为引用数据类型)

编译器自动调用了Integer.intValue()方法,switch 的查找原理是使用key-offset在目标表格中查找的。这里借鉴了这篇文章:https://www.cnblogs.com/HDK2016/p/6854671.html


总体来看,虽然switch...case在某些处理上的效率会高,但它有很多限制,对于处理的数据类型是有要求的,所以它并不像if...else那样广泛应用,if...else的应用范围就更广了,基本上应该是没什么限制的吧。

好啦,突发奇想,想到了switch...case,就找了些文章看了看,简单整理了一下哈哈。

猜你喜欢

转载自blog.csdn.net/alinekang/article/details/80906986