java1.7版本之后,switch条件支持字符串
2017-01-20 17:52
459 查看
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。
在Java7中,呼吁很久的String支持也终于被加上了。
在switch语句中,表达式的值不能是null,否则会在运行时抛出NullPointerException。在case子句中也不能使用null,否则会出现编译错误。
同时,case字句的值是不能重复的。对于字符串类型的也一样,但是字符串中可以包含Unicode转义字符。重复值的检查是在Java编译器对Java源代码进行相关的词法转换之后才进行的。也就是说,有些case字句的值虽然在源代码中看起来是不同的,但是经词法转换之后是一样的,就会在成编译错误。比如:“男”和“\u7537”就是一个意思。
然后看一个源代码及反编译后的代码:
反编译后的,还原成大致的Java的代码如下:
可以看出,字符串类型在switch语句中利用hashcode的值与字符串内容的比较来实现的;但是在case字句中对应的语句块中仍然需要使用String的equals方法来进一步比较字符串的内容,这是因为哈希函数在映射的时候可能存在冲突。
在Java7中,呼吁很久的String支持也终于被加上了。
在switch语句中,表达式的值不能是null,否则会在运行时抛出NullPointerException。在case子句中也不能使用null,否则会出现编译错误。
同时,case字句的值是不能重复的。对于字符串类型的也一样,但是字符串中可以包含Unicode转义字符。重复值的检查是在Java编译器对Java源代码进行相关的词法转换之后才进行的。也就是说,有些case字句的值虽然在源代码中看起来是不同的,但是经词法转换之后是一样的,就会在成编译错误。比如:“男”和“\u7537”就是一个意思。
然后看一个源代码及反编译后的代码:
public class StringForSwitch { public void test_string_switch() { String result=""; switch ("doctor") { case "doctor": result = "doctor"; break; default: break; } } }
反编译后的,还原成大致的Java的代码如下:
public class StringForSwitch { public StringForSwitch() { } public void test_string_switch() { String result = ""; String var2 = "doctor"; switch("doctor".hashCode()) { case -1326477025: if(var2.equals("doctor")) { result = "doctor"; } default: break; } } }
可以看出,字符串类型在switch语句中利用hashcode的值与字符串内容的比较来实现的;但是在case字句中对应的语句块中仍然需要使用String的equals方法来进一步比较字符串的内容,这是因为哈希函数在映射的时候可能存在冲突。
相关文章推荐
- IDEA如何解决switch不支持字符串的编译错误(1.7版本提示不兼容)
- IntelliJ IDEA (java: -source 1.6 中不支持 switch 中存在字符串 (请使用 -source 7 或更高版本以允许 switch 中存在字符串)
- Java switch不支持使用字符串对象
- maven 编译报错 java: -source 1.5 中不支持switch 中存在字符串
- 将jdk版本:jdk1.8更换为jdk1.7之后输入java -version还是出现1.8的版本号
- Maven install: java: -source 1.5 中不支持switch 中存在字符串
- java: -source 1.6 中不支持 switch 中存在字符串.....
- 《Java 编程思想》004 switch对字符串支持的引申思考
- 更换jdk版本:jdk1.8更换为jdk1.7之后输入java -version还是出现1.8的版本号
- 判断eclipse版本能否支持java 1.7的方法
- java7 switch case支持字符串的原理解析
- 更换jdk版本:jdk1.8更换为jdk1.7之后输入java -version还是出现1.8的版本号
- java: -source 1.6 中不支持 switch 中存在字符串 和 "compileDebugJavaWithJavac"的错误解决
- 更换jdk版本:jdk1.8更换为jdk1.7之后输入java -version还是出现1.8的版本号
- java: -source 1.6 中不支持 switch 中存在字符串.....
- java: -source 1.6 中不支持switch 中存在字符串
- Java,Jdk1.7以下Switch如何使用字符串类型
- java -source 1.6 中不支持 switch 中存在字符串
- 1.7 switch支持字符串真相
- 将jdk版本:jdk1.8更换为jdk1.7之后输入java -version还是出现1.8的版本号