Java中的switch

Switch

switch相较于if条件语句,有其独特之处,所以拿出来溜一下。

语法:

switch(expression){
    case value :
       //语句
       break; //可选
    case value :
       //语句
       break; //可选
    //你可以有任意数量的case语句
    default : //可选
       //语句
       break; //可选
}
  • expression:

    switch 语句中的变量类型可以是: byte、short、int 或者 char。从JDK1.5 才开始支持枚举类型。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。

    其实在Java底层中,switch中的表达式只支持int类型(byte,char,short能够自动转为int)。enum在底层中的存储方式也是int类型。而表达式为字符串时,使用的是其本身的hash值来代替字符串,再使用equals方法比较字符串对象是否一致。如果hash值和equals都一致,才确定了switch选择。

    刚学Java时,教材和老师都说switch的表达式只能是int,char这些整型,其实是不完整的。switch的表达式可以是字符(char)类型和整型类型,除了long类型。为什么long被除外呢?我们可以揣测Java开发人员的想法:既然要一个量来做到精确的比较,那么只能使用整型类型,因为浮点类型存在精度问题。接着,既然要使用整型,那么哪些整型可以使用呢?有必要使用long类型吗?long类型的数据范围有264,实际开发中不可能会需要这么多的case,而且int是最常用的整型类型。因此Java底层中,switch只支持int类型。以上纯胡扯,未来版本也有可能支持long类型。

  • case:

    case后的值必须是字面值,切不能出现重复。

  • break:

    用于跳出switch语句块。

  • default:

    如果所有的case都不满足,则进入default分支。default可以放在switch分支的任意位置(不过通常放在最后)。

注意

  • JVM会从上到下依次匹配case后的值。如果匹配成功,则执行这个case后的所有语句块(包括其他case和default内的),JVM会忽略case,除非遇到break则跳出switch结构,或者到达switch语句末尾而正常跳出。

    int i = 2;
    switch (i) {
    	case 1:
    		System.out.print(1);
    	case 2:						//从上往下依次匹配。进入case 2分支
    		System.out.print(2);	
    	case 3:
    		System.out.print(3);	//往下顺序执行代码(JVM忽略case),除非遇到break,或switch语句结尾。
    	default:
    		System.out.print("default");
    }
    //out:23default
    
    int i = 2;
    switch (i) {
    	case 1:
    		System.out.print(1);
            break;
    	case 2:						//从上往下依次匹配。进入case 2分支
    		System.out.print(2);
            break;					//跳出swtich语句块,语句块后的代码不再执行
    	case 3:
    		System.out.print(3);	
            break;
    	default:
    		System.out.print("default");
    }
    //out:2
    
    int i = 4;
    switch (i) {
    	case 1:
    		System.out.print(1);
            break;
    	case 2:						
    		System.out.print(2);
            break;					
    	case 3:
    		System.out.print(3);	
            break;
    	default:			//从上往下依次匹配,如果所有case项都不满足,则进入default
    		System.out.print("default");		
    }
    //out:default
    
    int i = 4;
    switch (i) {
        default:			//从第一个case开始从上往下依次匹配,如果所有case项都不满足,则进入default项
    		System.out.print("default");	
    	case 1:
    		System.out.print(1);	//往下顺序执行
    	case 2:						
    		System.out.print(2);
            break;					//遇到break,跳出switch语句块
    	case 3:
    		System.out.print(3);	
            break;
    }
    //out:default12
    
  • String类型作为表达式

    String str = "B";
    switch(str){
        case "A":
            System.out.println("A");
            break;
        case "B":
            System.out.println("B");
            break;
        case "C":
            System.out.println("C");
            break;
        default:
            System.out.println("default");
    }
    

    为了让Java功能更强大,让程序员更省心,switch支持String总算是千呼万唤使出来。有人可能会问,switch底层不是只支持int类型嘛,突然又来个String是什么鬼?我们将上述代码经过反编译后:

    String str = "B";
    byte var3 = -1;
    switch (str.hashCode()) {
    	case 65:
    		if (str.equals("A")) {
    			var3 = 0;
    		}
    		break;
    	case 66:
    		if (str.equals("B")) {
    			var3 = 1;
    		}
    		break;
    	case 67:
    		if (str.equals("C")) {			
                var3 = 2;
    		}
    }
    		
    switch (var3) {
    	case 0:
    		System.out.println("A");
    		break;
    	case 1:
    		System.out.println("B");
    		break;
    	case 2:
    		System.out.println("C");
    		break;
    	default:
    		System.out.println("default");	
    }
    

    从上可以看到:

    当表达式为字符串时,先使用其本身的hash值来代替字符串,再使用equals方法比较字符串对象是否一致。如果hash值和equals都一致,才确定了switch选择,然后执行响应的代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值