为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不能对字符串使用开关语句?

为什么不能对字符串使用开关语句?

吃鸡游戏 2019-06-01 16:43:07
为什么不能对字符串使用开关语句?这一功能是否将被应用到稍后的Java版本中?有人能解释一下为什么我不能这样做吗,就像Java的技术方法switch陈述有用吗?
查看完整描述

4 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

开关语句String案件已在JavaSE 7,至少16年在他们第一次被要求之后。没有提供拖延的明确原因,但很可能与业绩有关。

JDK中的实现7

这个特性现在已经在javac 用“去糖”的方法;使用String常量case声明在编译时按模式扩展为更复杂的代码。生成的代码使用一贯存在的JVM指令。

switch带着String在编译过程中,大小写被转换成两个开关。第一个字符串将每个字符串映射到一个唯一的整数-它在原始开关中的位置。这是通过首先切换标签的哈希代码来完成的。相应的情况是if语句,该语句测试字符串相等;如果散列上存在冲突,则测试为级联。if-else-if..第二个开关反映了原始源代码中的情况,但是用相应的位置替换了CASE标签。这个两步的过程使得保持原始开关的流量控制变得很容易.

JVM中的交换机

的更多技术深度switch,您可以参考JVM规范,其中转换语句的编译被描述。简单地说,有两个不同的JVM指令可以用于一个开关,这取决于情况下使用的常量的稀疏性。这两种方法都依赖于使用整数常量来有效地执行每一种情况。

如果常量是稠密的,则将其用作一个索引(减去最低值后)到指令表指针中-tableswitch指令。

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

含糖switch在……上面String对象,这两个指令都可能被使用。这个lookupswitch适合于第一次打开哈希码找到原来的情况。生成的序号自然适合于tableswitch.

这两个指令都要求在编译时对分配给每种情况的整数常量进行排序。在运行时,而O(1)表现tableswitch一般比O(log(n))表现lookupswitch,需要进行一些分析才能确定表的密度是否足以证明空时权衡是合理的。比尔·文纳斯一篇伟大的文章这将更详细地说明这一点,同时还将查看其他Java流控制指令。

在JDK之前7

在JDK 7之前,enum可以近似为aString-基础开关。这个用静电valueOf由编译器在enum类型。例如:

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


查看完整回答
反对 回复 2019-06-01
?
HUWWW

TA贡献1874条经验 获得超12个赞

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

当然,枚举可以有一个“Other”条目,以及一个From String(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;}


查看完整回答
反对 回复 2019-06-01
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

下面是一个基于JeeBee文章的完整示例,使用java enum而不是使用自定义方法。

注意,在JavaSE 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  }}


查看完整回答
反对 回复 2019-06-01
?
慕后森

TA贡献1802条经验 获得超5个赞

基于整数的开关可以优化为非常有效的代码。基于其他数据类型的开关只能编译成一系列if()语句。

由于这个原因,C&C+只允许整数类型上的开关,因为它与其他类型没有意义。

C#的设计者认为这种风格很重要,即使没有优势。

Java的设计者显然和C的设计者一样认为。


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 451 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号