Java-java 7 string switch实现
在Java里,JVM通过lookupswitch指令来完成switch语句,这个对于int,char这样的类型是可以直接通过跳转表来实现的。但是在Java 7里switch语句支持string了,这是怎么实现的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在Java里,JVM通过lookupswitch指令来完成switch语句,这个对于int,char这样的类型是可以直接通过跳转表来实现的。但是在Java 7里switch语句支持string了,这是怎么实现的呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
这里把字节码贴出来就更清楚了.
可以看到 lookupswitch 里匹配 hashcode, 在分支里还会用 equals 再匹配一次.
Java 7里面确实开始支持String了,但是注意:是String,不是string。所以,其实支持的是一个String object。
官方的解释是:
The String in the switch expression is compared with the expressions associated with each case label as if the String.equals method were being used.
从这段解释中可以看出,对于String的支持,分支Switch的判断是通过调用类似方法String.equals()来实现的。
另外,官方还给了一个注意事项:
Note: This example checks if the expression in the switch statement is null. Ensure that the expression in any switch statement is not null to prevent a NullPointerException from being thrown.
从这段提示可以看出,在Switch中使用String时,为了防止抛出空指针异常,要确保任意一个分支状态都不能是null。即所有case后面的值都不能是null。
补充:
具体switch内部的实现是:
1.把所有的case后面的String对象调用hashCode()方法,获取一个hash值(int类型),这个hash值唯一标识着这个case。
2.当有一个带匹配字符串进来的时候,也是先调用该字符串的hashCode()函数,获取一个hash值(int类型),然后用这个hashCode值匹配所有case,如果没有匹配成功,说明不存在;如果匹配成功了,就直接调用String.equals()函数匹配字符串了。这里为什么hash值匹配成功了还需要再匹配字符串呢?因为不同的字符串调用hashCode()函数可能得到相同的hash值,为了防止这种情况,在hash值匹配成功之后,还需要再次调用String.equals()匹配目标字符串。如果这个时候匹配成功了,就是真正匹配成功了。
其实从上述实现过程也可以看出:
1.switch对字符串的支持,实质上也是int类型值的匹配,只是这个int值是带匹配字符串的hashCode()的返回值,然后匹配成功之后,内部再调用String.equals()函数来实现实质性的匹配的。
2.由于需要计算所有case对应的字符串和带匹配字符串的hashCode()值,所以所有的这些字符串都不能为null,即传入的字符串不能为null,每一个case情况下对应的字符串也不能为null,否则就会抛出空指针异常了。
switch语句在编译之后会生成一个映射表,根绝映射表来进行跳转。
java 中的 string 和 C++ 中不同,java中是一个不可改变的常量值,所以编译之后应该是和整型一样,生成一个映射表。
java中的这种机制我也不是很熟悉,希望Java大神更详细的解答。