本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看活动链接
“为什么不能在字符串上使用switch语句?
此功能是否将在以后的Java版本中使用?
有人可以解释为什么我不能这样做吗,就像Javaswitch语句的技术方法那样?
高分回答:
以下是基于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…
作者建议:这真是没想到的,挺不错
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞? 求关注❤️ 求分享? 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️