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

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

上一篇 下一篇

此功能是否会放入以后的 Java 版本中?

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

分割线

网友回答:

如果您在代码中有一个可以打开字符串的位置,那么最好将字符串重构为可以打开的可能值的枚举。当然,您将字符串的潜在值限制为枚举中的值,这可能是需要的,也可能不是需要的。

当然,您的枚举可以有一个“其他”条目和一个fromString(String)方法,那么您可以拥有

ValueEnum enumval = ValueEnum.fromString(myString);
switch (enumval) {
   case MILK: lap(); break;
   case WATER: sip(); break;
   case BEER: quaff(); break;
   case OTHER: 
   default: dance(); break;
}

分割线

网友回答:

带有大小写的 switch 语句已经在 Java SE 7 中实现,至少在首次请求它们 16 年后。没有提供延迟的明确原因,但可能与性能有关。String

JDK 7 中的实现

该功能现已通过“脱糖”过程实现;在声明中使用常量的干净、高级语法在编译时会按照模式扩展为更复杂的代码。生成的代码使用一直存在的 JVM 指令。javacStringcase

A with case 在编译期间转换为两个开关。第一个将每个字符串映射到一个唯一的整数,即它在原始交换机中的位置。这是通过首先打开标签的哈希代码来完成的。相应的情况是测试字符串相等性的语句;如果哈希值存在冲突,则测试是级联的。第二个开关反映了原始源代码中的样式,但将大小写标签替换为相应的位置。这个两步过程可以轻松保留原始交换机的流量控制。switchStringifif-else-if

JVM 中的交换机

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

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

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

在对对象进行脱糖时,可能会使用这两个指令。适用于第一次打开哈希码以找到原始位置的情况。生成的序数是 .switchStringlookupswitchtableswitch

这两个指令都需要在编译时对分配给每个事例的整数常量进行排序。在运行时,虽然 的性能通常看起来优于 的性能,但它需要一些分析来确定表是否足够密集以证明时空权衡的合理性。Bill Venners 写了一篇很棒的文章,更详细地介绍了这一点,并深入介绍了其他 Java 流控制指令。O(1)tableswitchO(log(n))lookupswitch

在 JDK 7 之前

在 JDK 7 之前,可以近似于基于 -的交换机。这使用编译器在每个类型上生成的静态方法。例如:enumStringvalueOfenum

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

分割线

网友回答:

以下是基于 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
  }
}

模板简介:该模板名称为【为什么不能在字符串上使用 switch 语句?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 166次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-05
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
单页式简历模板 微信模板 html5 微信文章 微信公众平台 企业网站 响应式 自适应 微信素材 微信图片
您可能会喜欢的其他模板