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

亚历克斯·比尔兹利(Alex Beardsley):

此功能是否将在以后的Java版本中使用?

有人可以解释为什么我不能这样做吗,就像Java switch语句的技术方法那样

埃里克森:

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

在JDK 7中实现

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

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

在JVM中切换

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

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

如果常量稀疏,则执行二进制搜索以查找正确的大小写— lookupswitch指令。

switchString物体进行脱糖,可能会同时使用这两种指令。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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Java的switch语句中不能使用“ continue”?

为什么不能在DELETE语句中使用别名?

为什么不能在switch语句中声明变量?

为什么switch语句不能应用于字符串?

为什么不能在分配中使用Unicode字符√和??

为什么不能在switch语句中使用元组常量作为大小写

为什么在C样式的字符串上使用==起作用?

是否给出“为什么不能将switch语句应用于字符串”的答案?即使使用C ++ 11/14还是正确的吗?

为什么我不能在带斜线的子字符串上使用?

为什么最终变量不能在switch语句中使用?

为什么手动运行SQL块可以工作,但不能在同一字符串上使用EXECUTE IMMEDIATE呢?

为什么我不能在这样的字符串上替换char?

为什么不能在字符串前使用@ $前缀?

为什么我的Switch陈述式案例无法在完全匹配的字符串上触发?

为什么不能在公共静态字符串上使用串联

为什么不能在会话变量中使用字符串数字作为索引?

为什么不能在指向字符串文字后使用free()指针

VS Code中的JavaScript:为什么不能在“ switch”语句中折叠“ case”代码块?

Android-为什么不能在if子句中使用getResources()。getStringArray返回的字符串?

Javascript switch语句在拆分字符串上失败

为什么不能在 if 语句中使用空指针?

为什么我们不能像 For 循环那样在字符串上使用 Foreach 循环

为什么我不能在类中放置 switch 语句

为什么我不能在输入中使用空格字符?

Javascript 不能在日期字符串上使用 .now()

为什么我不能在字符串中使用“@”运算符?

为什么我们不能在 switch 语句中使用关系表达式?

为什么不能在 if....else 中使用 str 语句

如果可以在字符串上找到属性名称,为什么不能在 undefined 上找到它们?