因为
switch语句是使用两个特殊的JVM指令
lookupswitch和编译的
tableswitch。在处理很多案例时它们很有用,但是当您只有很少的分支机构时,它们会导致开销。
if/else相反,一条语句被编译为典型的
je
jne…链,这些链速度更快,但在长分支链中使用时需要更多的比较。
您可以通过查看字节码来看到差异,无论如何我都不担心这些问题,如果有什么可能成为问题,那么JIT会解决它。
实际示例:
switch (i){ case 1: return "Foo"; case 2: return "Baz"; case 3: return "Bar"; default: return null;}编译成:
L0 LINENUMBER 21 L0 ILOAD 1 TABLESWITCH 1: L1 2: L2 3: L3 default: L4L1 LINENUMBER 23 L1frame SAME LDC "Foo" ARETURNL2 LINENUMBER 24 L2frame SAME LDC "Baz" ARETURNL3 LINENUMBER 25 L3frame SAME LDC "Bar" ARETURNL4 LINENUMBER 26 L4frame SAME ACONST_NULL ARETURN
而
if (i == 1) return "Foo";else if (i == 2) return "Baz";else if (i == 3) return "Bar";else return null;
被编译成
L0 LINENUMBER 21 L0 ILOAD 1 ICONST_1 IF_ICMPNE L1L2 LINENUMBER 22 L2 LDC "Foo" ARETURNL1 LINENUMBER 23 L1frame SAME ILOAD 1 ICONST_2 IF_ICMPNE L3L4 LINENUMBER 24 L4 LDC "Baz" ARETURNL3 LINENUMBER 25 L3frame SAME ILOAD 1 ICONST_3 IF_ICMPNE L5L6 LINENUMBER 26 L6 LDC "Bar" ARETURNL5 LINENUMBER 28 L5frame SAME ACONST_NULL ARETURN



