JAVA switch 支持string 表达式的原理

虽然开发人员在 Java 源代码的 switch 语句中使用了字符串类型,但是在编译的过程中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数类型兼容的格式。不同的 Java 编译器可能采用不同的方式来完成这个转换,并采用不同的优化策略。

public class Test {  

    public void test(String type) {  
        switch (type) {  
        case "情况A":  
            break;  
        case "情况B":  
            break;  
        default:  
            break;  
        }  
    }  
}  

反编译得到

public class Test {  
    public void test(String paramString) {  
        String str = paramString;  
        int i = -1;  
        switch (str.hashCode()) {  
        case 24455345:  
            if (!str.equals("情况A"))  
                break;  
            i = 0;  
            break;  
        case 24455346:  
            if (!str.equals("情况B"))  
                break;  
            i = 1;  
        }  
        switch (i) {  
        case 0:  
            break;  
        case 1:  
            break;  
        }  
    }  
}  

从上面的代码中可以看出,原来用在 switch 语句中的字符串被替换成了对应的哈希值,而 case 子句的值也被换成了原来字符串常量的哈希值。经过这样的转换,Java 虚拟机所看到的仍然是与整数类型兼容的类型。在这里值得注意的是,在 case 子句对应的语句块中仍然需要使用 String 的 equals 方法来进行字符串比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值