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

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

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

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}很多的知识点,真的需要写出来才会掌握!!! 

以下是基于JeeBee的帖子的完整示例,使用Java枚举而不是自定义方法。

请注意,在Java SE 7和更高版本中,可以在switch语句的表达式中使用String对象。

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

String current = args[0];
Days currentDay = Days.valueOf(current.toUpperCase());

switch (currentDay) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
System.out.println("boring");
break;
case THURSDAY:
System.out.println("getting better");
case FRIDAY:
case SATURDAY:
case SUNDAY:
System.out.println("much better");
break;

}
}

public enum Days {

MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}

复制代码


高分回答: 在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;
}
复制代码


文章翻译自 ​​yl2gl72eozkinivz3vc6swkesy-ac4c6men2g7xr2a-translate.translate.goog/questions/3…​

作者建议:这真是没想到的,挺不错

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! 

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞???? 求关注❤️ 求分享???? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️