3

尽管 switch 语句可以表示为一系列 if 语句,但似乎当 Java switch 语句被编译成字节码时,使用了不同的方法。

  • 字节码使用什么表示?
  • 我认为这种替代表示是出于效率原因,那么效率与 if 语句表示相比如何?
  • 是否有任何其他考虑导致使用此表示?
4

2 回答 2

5

阅读规范。在 Java 中,如果您编写 switch 语句,则根据不同的情况,switch 将转换为字节码中的 tableswitch 指令。本质上是一个跳表。但是,如果 JIT 可以将字节码优化为更有效的东西,那么字节码的外观可能无关紧要。当然,这取决于平台。

于 2012-01-05T20:04:35.033 回答
0

考虑这个简单的 JavaScript 示例

var SwitchCases = [
// case 1
 function() { return "one"; },
// case 2
 function() { return "two"; },
// case 3
 function() { return "three"; },
// default
 function() { return ""; }
];
var SwitchCaseMin = 1;
var SwitchCaseMax = 3;
var SwitchCaseDefault = true;

function FakeSwitchCase(switch) {
 if(switch > SwitchCaseMax || switch < SwitchCaseMin) {
  if(SwitchCaseDefault == true) {
   return SwitchCases[SwitchCases.length-1]();
  }
 } else {
  return SwitchCases[switch - SwitchCaseMin]();
 }
}

关键部分是

SwitchCases[switch - SwitchCaseMin]();

想象一下,如果有很多情况,评估它们的代码不会变得更大,但是如果我们使用 IF..ELSE IF...ELSE,执行时间会随着每个添加的情况而增加。

在一个真正的 switch case 实现中,SwitchCases(来自上面的代码)将是一个数组/查找表的标签(读取:偏移量)到函数中出现 Case 代码块的位置。

编辑

在java中,上面的switch case会被编译成下面的字节码

[tableswitch 0xAA]
[padding bytes 0x00 or 0x0000 or 0x000000]
[offset of SwitchCases[3]] // default case
[SwitchCaseMin] // 1
[SwitchCaseMax] // 3
[offset of SwitchCases[0]] // case 1
[offset of SwitchCases[1]] // case 2
[offset of SwitchCases[2]] // case 3
于 2012-01-05T21:05:09.800 回答