switch语句中的String如何比相应的if-else语句更有效?

时间:2014-03-01 05:47:11

标签: java string if-statement switch-statement

Java documentation

  

Java编译器通常使用String对象生成比使用链接if-then-else语句的switch语句更高效的字节码。

交换机中的AFAIK偶数字符串以区分大小写的方式在内部使用.equals()。那么它们在这种背景下的效率是多少。编译速度更快?字节码少?更好的表现?

3 个答案:

答案 0 :(得分:71)

使用switch语句比equals更快(但只有在不止一些字符串的情况下才会显着)因为它首先使用hashCode的字符串的switch来确定子集可能匹配的字符串。如果case标签中的多个字符串具有相同的hashCode,则JVM将执行对equals的顺序调用,即使case标签中只有一个字符串表示hashCode,JVM也需要调用{{1}确认case标签中的字符串确实等于switch表达式中的字符串。

String对象上的开关的运行时性能与equals中的查找相当。

这段代码:

HashMap

内部编译并执行如下代码:

(不是字面意思,但如果您反编译两段代码,就会发现完全相同的操作序列发生了)

public static void main(String[] args) {
    String s = "Bar";
    switch (s) {
    case "Foo":
        System.out.println("Foo match");
        break;
    case "Bar":
        System.out.println("Bar match");
        break;
    }
}

答案 1 :(得分:18)

一般中,切换语句更好,因为它们(松散地说)O(1),而if-else链是O(n)

拥有n条件可能会导致使用链式n语句进行最多if-else次比较。

switch语句可以直接“跳转”到适当的条件(如地图)或默认情况下,使其成为O(1)

答案 2 :(得分:7)

这是从docs:

中的示例生成的字节码片段
 INVOKEVIRTUAL java/lang/String.hashCode ()I
    LOOKUPSWITCH
      -2049557543: L2
      -1984635600: L3
      -1807319568: L4
与if-else逻辑

相比,使用LOOKUPSWITCH具有更好的性能