为什么我不能打开String?

问题:

为什么无法启动String
这个功能是否会被放入更新的Java版本?
有人可以解释为什么我不能这样做,就像Java的switch语句工作的技术方法?

回答:

String案例的切换语句已在Java SE 7中实施,至少16年after they were first requested.没有提供延迟的明确原因,但可能与性能有关。

在JDK 7中实现

该功能现已在javac with a “de-sugaring” process;中使用case中使用String常量的干净,高级语法实现,编译时将扩展为更复杂的代码。生成的代码使用始终存在的JVM指令。
在编译期间,String个案例的switch被翻译成两个开关。第一个将每个字符串映射到一个唯一的整数 – 它在原始交换机中的位置。这是通过首先打开标签的哈希码来完成的。相应的情况是测试字符串相等性的if语句;如果哈希上有冲突,则测试是级联if-else-if。第二个开关反映原始源代码中的代码,但用相应的位置代替案例标签。这两步过程使得保持原始开关的流量控制变得容易。

切换到JVM

有关switch的更多技术深度,可以参考描述compilation of switch statements的JVM规范。简而言之,根据案例使用的常量的稀疏性,有两个不同的JVM指令可用于开关。两者都依赖于使用整数常量来执行每种情况。
如果这些常数是密集的,则将它们作为索引(在减去最低值之后)作为指令指针表(tableswitch指令)使用。
如果这些常数是稀疏的,则执行正确情况的二进制搜索 – lookupswitch指令。
String对象中,除了switch之外,这两个指令都可能被使用。 lookupswitch适合于首先打开哈希码,以找到案例的原始位置。所得到的序数对于tableswitch
这两个指令都要求在编译时对分配给每种情况的整型常数进行排序。在运行时,虽然tableswitchO(1)性能通常比lookupswitchO(log(n))性能更好,但是需要进行一些分析来确定表是否足够密实,以证明时空间的权衡。比尔·维纳斯(Bill Venners)撰写了a great article,详细介绍了这一点,以及其他Java流程控制指令。

之前JDK 7

在JDK 7之前,enum可以逼近基于String的交换机。这使用编译器在每个enum类型上生成的the static valueOf方法。例如:

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

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why can’t I switch on a String?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

77 + = 85