栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么不能在字符串上使用switch语句?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么不能在字符串上使用switch语句?

带有

String
案例的switch语句已在Java SE 7中实现,至少在首次提出要求后的 16年。没有提供延迟的明确原因,但可能与性能有关。

在JDK 7中实现

现在,该功能已

javac
通过“脱糖”过程实现。
String
case
声明时使用常量的干净,高级语法在编译时扩展为遵循模式的更复杂的代码。生成的代码使用始终存在的JVM指令。

switch
带有
Stringcase
的A 在编译期间转换为两个开关。第一个将每个字符串映射到一个唯一的整数-它在原始开关中的位置。这是通过首先打开标签的哈希码来完成的。相应的情况是if测试字符串是否相等的语句;如果哈希上有冲突,则测试为级联if-else-if。第二个开关在原始源代码中进行镜像,但是用相应的位置替换了大小写标签。此两步过程使保留原始交换机的流量控制变得容易。

在JVM中切换

有关的更多技术深度

switch
,请参考JVM规范,其中描述了switch语句的编译。简而言之,有两种不同的JVM指令可用于切换,具体取决于案例使用的常量的稀疏性。两者都依赖于每种情况下使用整数常量来有效执行。

如果常量密集,则将它们用作指令指针表(指令)的索引(减去最小值后)

tableswitch

如果常量稀疏,则对

lookupswitch
指令的正确大小写进行二进制搜索。

switch
String
物体进行脱糖时,可能会同时使用这两种指令。在
lookupswitch
对散列码的第一开关以找到的情况下的原始位置是合适的。由此产生的序数是自然适合
tableswitch

两条指令都要求在编译时对分配给每种情况的整数常量进行排序。在运行时,虽然O(1)性能

tableswitch
一般显得比更好
O(log(n))
的性能
lookupswitch
,它需要一些分析,以确定该表是否是密集足以证明时空权衡。Bill Venners撰写了一篇很棒的文章,其中更详细地介绍了此内容,同时还深入介绍了其他Java流程控制指令。

在JDK 7之前

在JDK 7之前,

enum
可以近似
String
基于的开关。这将使用编译器针​​对每种类型生成的静态
valueOf
方法
enum
。例如:

Pill p = Pill.valueOf(str);switch(p) {  case RED:  pop();  break;  case BLUE: push(); break;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372486.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号